backtick subshell

N

Noah Easterly

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.
 
N

Nate Wiger

Noah said:
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

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
 
N

Noah Easterly

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?

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.

irb(main):001:0> `echo $SHELL`
=> "/bin/bash\n"
YMMV, depending on platform and version.
 
P

powlow

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,756
Messages
2,569,533
Members
45,007
Latest member
OrderFitnessKetoCapsules

Latest Threads

Top