Differences between revisions 6 and 17 (spanning 11 versions)
Revision 6 as of 2007-10-09 17:35:09
Size: 2676
Editor: JariAalto
Comment: Move "It's easier to read" to the beginning of bullet. Mention keyboard key trouble, font trouble
Revision 17 as of 2010-11-04 08:36:31
Size: 2069
Editor: finproxy
Comment: Add POSIX URL
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
[[Anchor(faq82)]] <<Anchor(faq82)>>
Line 3: Line 3:
Line 6: Line 5:
 * It's easier to read. The character ` is difficult to read with small fonts or on large display. The key may to access the character may be located in a obscure place in non-US keyboard.  * It's easier to read.  The character {{{`}}} is difficult to read with small or unusual fonts.
Line 8: Line 7:
 * It's easier to type. The physical key to produce the character may be located in an obscure place on keyboards, or may not be present at all (like in the standard italian keyboard).

 * The backtick is easily confused with a single quote. People who see {{{$()}}} don't normally press the wrong keys. On the other hand, some people who see {{{`cmd`}}} may mangle it into {{{'cmd'}}} because they don't know what a backtick is.
Line 14: Line 16:
 * Newbies who see {{{$()}}} don't normally press the wrong keys. On the other hand, newbies who see {{{`cmd`}}} often mangle it into {{{'cmd'}}} because they don't know what a backtick is.
Line 18: Line 18:
  echo "`echo \\a`" # prints a
  echo "`echo \\\a`" # prints \a
  echo "`echo \\\\a`" # prints \a}}}
 Inside {{{$()}}}, there are no such surprises.
  $ echo "`echo \\a`" "$(echo \\a)"
  a \a
  $ echo "`echo \\\\a`" "$(echo \\\\a)"
  \a \\a
  # Note that this is true for *single quotes* too!
  $ foo=`echo '\\'`; bar=$(echo '\\'); echo "foo is $foo, bar is $bar"
  foo is \, bar is \\
  }}}
Line 31: Line 35:
Backslashes are no more no less surprising than elsewhere IMHO
{{{
  echo `echo \a` # prints a
  echo `echo \\a` # prints a
  echo `echo \\\a` # prints \a
  echo `echo \\\\a` # prints \a
  echo $(echo \a) # prints a
  echo $(echo \\a) # prints \a
  echo $(echo \\\a) # prints \a
  echo $(echo \\\\a) # prints \\a
}}}
The same sort of things happens without any quotes or within "".

I suspect the real advantage of $( ) here is that you don't need to take extra care of the quotes (\ ""), you just put them as usual, ie
{{{echo "`echo \"foo bar\"`"}}} vs {{{echo "$( echo "foo bar")"}}} -- pgas
 ''Just for the record, \" inside {{{`backticks`}}} is only required in Korn shell and Bourne shell. Bash and dash both treat''
 {{{
 echo "`echo "foo bar"`"}}}
 ''exactly the same way they treat''
 {{{
 echo "$(echo "foo bar")"}}}
 ''although this is an excellent point that I'm going to add to the bullet list up above.'' -- GreyCat

The only time backticks are preferred is when writing code for the oldest Bourne shells, which do not know about {{{$()}}}.
The only time backticks are preferred is when writing code for the oldest Bourne shells, which are not POSIx compliant. See [http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_03 POSIX standard and section "command substitution2] for {{{$()}}}.

Why is $(...) preferred over `...` (backticks)?

For several reasons:

  • It's easier to read. The character ` is difficult to read with small or unusual fonts.

  • It's easier to type. The physical key to produce the character may be located in an obscure place on keyboards, or may not be present at all (like in the standard italian keyboard).
  • The backtick is easily confused with a single quote. People who see $() don't normally press the wrong keys. On the other hand, some people who see `cmd` may mangle it into 'cmd' because they don't know what a backtick is.

  • It makes nesting command substitutions easier. Compare:
    •   x=$(grep $(dirname "$path") file)
        x=`grep \`dirname "$path"\` file`
    It just gets uglier and uglier after two levels.
  • Backslashes (\) inside backticks are handled in a non-obvious manner:
    •   $ echo "`echo \\a`" "$(echo \\a)"
        a \a
        $ echo "`echo \\\\a`" "$(echo \\\\a)"
        \a \\a
        # Note that this is true for *single quotes* too!
        $ foo=`echo '\\'`; bar=$(echo '\\'); echo "foo is $foo, bar is $bar" 
        foo is \, bar is \\
  • Nested quoting inside $() is far more convenient.

    •   echo "x is $(echo "$y" | sed ...)"

    In this example, the quotes around $y are treated as a pair, because they are inside $(). This is confusing at first glance, because most C programmers would expect the quote before x and the quote before $y to be treated as a pair; but that isn't correct in shells. On the other hand,

    •   echo "x is `echo \"$y\" | sed ...`"
    requires backslashes around the internal quotes in order to be portable. Bourne and Korn shells require these backslashes, while Bash and dash don't.

The only time backticks are preferred is when writing code for the oldest Bourne shells, which are not POSIx compliant. See [http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_03 POSIX standard and section "command substitution2] for $().

BashFAQ/082 (last edited 2022-02-19 00:13:59 by larryv)