What's the difference between $(stuff) and `stuff`?

There are two syntaxes for command substitution: with dollar-parentheses and with backticks.
Running top -p $(pidof init) and top -p `pidof init` gives the same output. Are these two ways of doing the same thing, or are there differences?

Asked By: tshepang


Obvious difference I observe is that you cannot nest backticks while you can nest $(). Maybe both exist for legacy reasons. Similarly, the . and source commands are synonyms.

Answered By: balki

The old-style backquotes ` ` do treat backslashes and nesting a bit different. The new-style $() interprets everything in between ( ) as a command.

echo $(uname | $(echo cat))

echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat

works if the nested backquotes are escaped:

echo `uname | `echo cat``

backslash fun:

echo $(echo '\')

echo `echo '\'`

The new-style $() applies to all POSIX-conformant shells.
As mouviciel pointed out, old-style ` ` might be necessary for older shells.

Apart from the technical point of view, the old-style ` ` has also a visual disadvantage:

  • Hard to notice: I like $(program) better than `program`
  • Easily confused with a single quote: '`'`''`''`'`''`'
  • Not so easy to type (maybe not even on the standard layout of the keyboard)

(and SE uses ` ` for own purpose, it was a pain writing this answer 🙂

Answered By: wag

$() does not work with old Bourne shell. But it has been years decades since I worked with old Bourne shell.

Answered By: mouviciel

Another note, $() will use more system resource than using backticks, but is slightly faster.

In Mastering Unix shell scripting, Randal K. Michael had done a test in a chapter named “24 Ways to Process a File Line-by-Line”.

Answered By: cuonglm

The $() syntax will not work with the old bourne shell.
With newer shells ` ` and $() are equivalent but $() is much more convenient to use when you need to nest multiple commands.

For instance :

echo $(basename $(dirname $(dirname /var/adm/sw/save )))

is easier to type and debug than :

echo `basename `dirname \`dirname /var/adm/sw/save \```
Answered By: Emmanuel

To add to what others said here, you can use the backticks to simulate inline comments:

echo foo `# I'm a comment!` bar

The output is: foo bar.

See the following for more information: https://stackoverflow.com/a/12797512 (Note also the comments below that post.)

Answered By: phk