这两者都是命令替换,命令替换是指:是Shell 执行命令并将命令替换部分替换为执行该命令后的结果。
比如:
[bob@centos home]$ val=hello
[bob@centos home]$ echo $(echo $val)
hello
[bob@centos home]$ echo `echo $val`
hello
或者:
[bob@centos home]$ echo $(date)
2017年 06月 25日 星期日 20:24:20 CST
[bob@centos home]$ echo `date`
2017年 06月 25日 星期日 20:24:28 CST
区别:
反引号是 Bourne shell遗留下来的。
而
()是POSIX支持,同时也兼容反引号。
()对命令的嵌套更清晰,更方便。
主要提倡使用$() 而不是 使用反引号有以下几个原因:
(1)当你写了这种命令使用反引号是会眼花的。而使用括号就清晰很多,嵌套也很方便。
libdir=$(dirname $(dirname $(which gcc)))/lib
libdir=`dirname \`dirname \\\`which gcc\\\`\``/lib
(2)还有一个原因对反斜杠的处理
只有两个反斜杠时
[bob@centos home]$ echo "`echo \\a`"; echo "$(echo \\a)"
a
\a
增加后
[bob@centos home]$ echo "`echo \\\a`"; echo "$(echo \\\a)"
\a
\a
在加一个
[bob@centos home]$ echo "`echo \\\\a`"; echo "$(echo \\\\a)"
\a
\\a
面对单引号中如此诡异的行为,我有点发虚。
在看看在括号中,将反斜杠当做转义,都可以解释清楚。
(3)反引号 嵌套使用需要反斜杠转义
[bob@centos home]$ echo $(echo $(date))
2017年 06月 25日 星期日 20:42:32 CST
[bob@centos home]$ echo `echo `date``
date
[bob@centos home]$ echo `echo \`date\``
2017年 06月 25日 星期日 20:42:42 CST
[bob@centos home]$
综上所述:$() 是被提倡使用的也是首选方法,它具有清晰的语法,提高人的可读性,嵌套很直观,内部解析分开的对反引号的解析也符合人们的常识。而反引号是不被推荐的,其容易伪装的语法,而外观极其像单引号,而不推荐被使用。
参考:
What is the benefit of using $() instead of backticks in shell scripts?