# 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?

• See also: BashFAQ/082. – Dennis Williamson Jan 13 '11 at 16:38
• For a second there I thought this was a jQuery question. – David Murdoch Jan 13 '11 at 20:42
• The result might depend on the shell - some support both. – artdanil Feb 15 '11 at 22:33

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)) Linux 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\ Linux  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 :)

• The only thing I would add, is that I call '(' a paren, not a bracket (which is '['). – Kendall Helmstetter Gelner Jan 13 '11 at 18:09
• @Kendall: and here I thought '{' was the left bracket for all those years... – SamB Jan 13 '11 at 20:32
• @Sam: { } is usually called "curly brackets" or "braces" en.wikipedia.org/wiki/Braces_(punctuation)#Braces – Jørn Schou-Rode Jan 13 '11 at 21:35
• I also refer to '{' as curly braces. Though it seems odd you need to add the qualifier "curly" if you call the other things brackets... I guess it's just because they actually curl. – Kendall Helmstetter Gelner Jan 14 '11 at 4:23
• @slim I don't know on US/UK keyboards, but on spanish keyboards  is a dead key, so I have to type either a double-backtick (something I usually forget I can even do) or backtick then space, which is a pain. – Darkhogg Apr 4 '14 at 16:39

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. • Some Bourne-derived shells don't recognize source. Dash is one example. – Dennis Williamson Jan 13 '11 at 16:40 • That's not true. You can nest backtick to any level, just more painfully. Note that both $(...) and ... are standard (the latter being deprecated) while . is standard but not source – Stéphane Chazelas Oct 25 '12 at 10:17
• Correction, only in (t)csh can they not be nested. (t)csh don't support $(...) though. They do support source (and not .) though. – Stéphane Chazelas Aug 1 '14 at 12:28 $() does not work with old Bourne shell. But it has been years decades since I worked with old Bourne shell.

• Old as in 1970's and early 1980's, correct? – Christopher Oct 1 at 19:15

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". • This claim is nonsense. There is no reason why it should be faster as it is just using a different notation for the parser. – schily Sep 6 '15 at 13:17 • @schily: Maybe, I only quote from the book, you can read it for more details. – cuonglm Sep 6 '15 at 15:19 • I would tend to agree with @schily...why would it take more resources? – Wildcard Mar 7 '16 at 23:21 • @Wildcard, I suppose it's because $() makes your script one byte bigger than if it used  (assuming you don't nest them and don't use backslashes within). As to which would be faster to parse, that would vary between shells and would be irrelevant as negligible compared to the cost of creating a pipe and forking of process which command substitution entails. – Stéphane Chazelas Dec 2 '16 at 9:45

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.

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 )))

echo basename \dirname \\\dirname /var/adm/sw/save \\\\