Linux 中 shell 中反引号与 $() 的对比

来源:互联网 发布:秦时明月知乎 编辑:程序博客网 时间:2024/05/29 02:26

这两者都是命令替换,命令替换是指:是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)))/liblibdir=`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))20170625日 星期日 20:42:32 CST[bob@centos home]$ echo `echo `date``date[bob@centos home]$ echo `echo \`date\``20170625日 星期日 20:42:42 CST[bob@centos home]$ 

综上所述:$() 是被提倡使用的也是首选方法,它具有清晰的语法,提高人的可读性,嵌套很直观,内部解析分开的对反引号的解析也符合人们的常识。而反引号是不被推荐的,其容易伪装的语法,而外观极其像单引号,而不推荐被使用。

参考:

What is the benefit of using $() instead of backticks in shell scripts?