Size: 895
Comment: Add example for non-obvious backslashing behaviour
|
Size: 1499
Comment: are they really surprising? maybe we can generalize to all quotes instead?
|
Deletions are marked like this. | Additions are marked like this. |
Line 25: | Line 25: |
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 |
Why is $(...) preferred over `...` (backticks)?
For several reasons:
- It makes nesting command substitutions easier. Compare:
x=$(grep $(dirname "$path") file) x=`grep \`dirname "$path"\` file`
- 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.
- Backslashes (\) inside backticks are handled in a non-obvious manner:
echo "`echo \\a`" # prints a echo "`echo \\\a`" # prints \a echo "`echo \\\\a`" # prints \a
Inside $(), there are no such surprises.
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
The only time backticks are preferred is when writing code for the oldest Bourne shells, which do not know about $().