Differences between revisions 3 and 14 (spanning 11 versions)
Revision 3 as of 2007-09-13 19:19:33
Size: 895
Editor: BetterWorld
Comment: Add example for non-obvious backslashing behaviour
Revision 14 as of 2010-06-05 09:52:41
Size: 1849
Editor: p54B07555
Comment:
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 or unusual fonts.

 * It's easier to type. The physical key to produce the character may be located in an obscure place on keyboards.

 * 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 7: Line 12:
Line 11: Line 15:
Line 14: Line 17:
 * It's easier to read.
 * 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 17: Line 18:
  {{{
  $ 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 18: Line 28:
 * Nested quoting inside {{{$()}}} is far more convenient.
Line 19: Line 30:
  echo "`echo \\a`" # prints a
  echo "`echo \\\a`" # prints \a
  echo "`echo \\\\a`" # prints \a}}}

Inside {{{$()}}}, there are no such surprises.
  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.

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.
  • 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 do not know about $().

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