2

I was wondering why this command line does not print pidof sh:

$ sh -c "var=`pidof sh` ; echo \$var; ps -H"

This one prints 123 as expected

$ sh -c "var=123 ; echo \$var; ps -H"

I am on Ubuntu Linux.

jasonwryan
  • 71,734
  • 34
  • 193
  • 226
Ankur Agarwal
  • 3,108
  • 10
  • 35
  • 52

1 Answers1

4

You miss the quotes. One way to do it:

sh -c "var=\"`pidof sh`\" ; echo \$var; ps -H"

Another:

sh -c "var=\"\`pidof sh\`\" ; echo \$var; ps -H"

Notice that they differ in the moment when the pidof sh is executed! In the first version, the expression within backticks (pidof sh) is executed by your current shell - that is before sh -c is run. In the second, it is the sh -c command that executes pidof. More than that, the pidof is executed within a subshell that evaluates the expression within backticks - so you get one additional pid listed in the var variable. (Put it more simple: the backticks invoke another shell which is then listed by pidof.)

A better way for both would be to use $( ... ) or \$( ... ).

rozcietrzewiacz
  • 38,754
  • 9
  • 94
  • 102
  • Thanks that worked. But I don't understand what do you mean when you say "Notice that they differ in the moment when the pidof sh is executed!" – Ankur Agarwal Aug 28 '11 at 00:01
  • Also why do I get two pids listed on printing $var. I that for pidof program? – Ankur Agarwal Aug 28 '11 at 00:02
  • 1
    This is because at the time when `pidof` is executed, a second `sh` is running (a subshell) in order to evaluate what is between the backticks. – rozcietrzewiacz Aug 28 '11 at 00:23
  • 3
    @abc I suspect you meant to write `sh -c 'var=$(pidof sh); echo $var; ps -H'`. With the double quotes, as rozcietrzewiacz said, the `pidof` command was executed to build the string that is passed to `sh`. With single quotes, the text between the quotes is passed to `sh` as is. – Gilles 'SO- stop being evil' Aug 28 '11 at 09:39