Backtick subshell

What subshell does ` (backquote) use to run commands?

Noah E. [email protected] wrote:

What subshell does ` (backquote) use to run commands?

puts echo $SHELL

m.

I don’t think it’s using the $SHELL variable to choose which shell to
use (and I don’t trust all the shells to set $SHELL)

As an example:

so here’s a command that I get different responses on, depending on
which shell it’s run in

sh-2.05b$ ls **/.rb | wc -l
1
sh-2.05b$ zsh -c "ls **/
.rb | wc -l"
12

And in ruby backticks, I get the sh response

sh-2.05b$ ruby -e “puts %x{ls **/*.rb | wc -l}”
1

even when the $SHELL is set otherwise

sh-2.05b$ export SHELL=/bin/zsh
sh-2.05b$ echo $SHELL
/bin/zsh
sh-2.05b$ ruby -e “puts %x{echo $SHELL}”
/bin/zsh
sh-2.05b$ ruby -e “puts %x{ls **/*.rb | wc -l}”
1

or if the ruby script is run by a different shell

zsh: echo $SHELL
/bin/zsh
zsh: ruby -e “puts %x{echo $SHELL}”
/bin/zsh
zsh: ruby -e “puts %x{ls **/*.rb | wc -l}”
1

So my question remains, how is ruby choosing which shell to use for
backtick commands? (since in this case it really doesn’t seem like it’s
checking $SHELL at all).
I know I can force a choice of shell from within the backtick (ruby -e
‘puts %x{/bin/sh -c “ls **/*.rb | wc -l”}’), but I want to know where
ruby’s getting its choice of shell from.

Noah E. wrote:

sh-2.05b$ zsh -c “ls **/*.rb | wc -l”
12

And in ruby backticks, I get the sh response

sh-2.05b$ ruby -e “puts %x{ls **/*.rb | wc -l}”
1

How about

ruby -e "puts %x{zsh -c 'ls **/*.rb' | wc -l}"

I would not trust ruby to figure out the “correct” shell. I would not
even be surprised if it was hardwired to /bin/sh for consistent
behavior.

-Nate

On 11/14/06, Noah E. [email protected] wrote:

I don’t think it’s using the $SHELL variable to choose which shell to
use (and I don’t trust all the shells to set $SHELL)

$ ruby -e’ps -ef | grep rakrok
UID PID PPID NLWP PGID SID STIME TIME COMMAND

rakrok 1822 7866 0 15:55:57 pts/211 0:00 ruby -eputs ps -ef | grep rakrok
rakrok 2172 1822 0 15:55:57 pts/211 0:00 sh -c ps -ef | grep rakrok

So the shell being used is /bin/sh

-rr-

Ok, from skimming process.c in the ruby source, it looks like it’s hard
coded to use ‘sh’, either through
calls to system (implicitly, since it forwards to sh by ISO standards),
execl (explicitly), or spawnl (explicitly),
except in the case of WIN_32, though, when it calls do_spawn, which i
think checks the RUBYSHELL environment variable.

Which is confusing. Can anyone lend me some clarity?

Noah E. wrote:

What subshell does ` (backquote) use to run commands?

$ irb
irb(main):001:0> echo $SHELL
=> “/bin/bash\n”

YMMV, depending on platform and version.

Noah E. wrote:

I don’t think it’s using the $SHELL variable to choose which shell to
use (and I don’t trust all the shells to set $SHELL)

No, The $SHELL variable should be an accurate report of the shell in
use. It
is not a question of the $SHELL variable causing the named shell to be
used, but that it should accurately report which shell is in use. That
is
what it is supposed to do, and if it were not accurate, that would be a
serious bug.

(long pause …)

Based on the remaining content of your post, it seems the $SHELL
variable
isn’t reporting anything accurate or useful. That’s discouraging.

On Solaris it does seem to just use the sh shell. I tested it out with
some export commands (which work under ksh, the shell reported by echo $SHELL) and errors ocurred. If, however, I did it the sh way with
setting a variable and seperately exporting and then echoing, it worked
which seems to suggest sh.

irb(main):001:0> echo $SHELL
=> “/bin/ksh\n”
irb(main):002:0> export TEST=test; echo $TEST
sh: TEST=test: is not an identifier
=> “”
irb(main):003:0> TEST=test; export TEST; echo $TEST
=> “test\n”

Hope that helps