为什么命令替换的后引号和$()会导致不同的输出?

时间:2015-12-08 08:15:35

标签: linux shell

有人可以解释Linux中``(back-quotes)和$()之间的区别吗? 非常感谢你!

到现在为止,我刚刚发现:

$echo `echo \\\\ `
\
$echo $(echo \\\\ )
\\

2 个答案:

答案 0 :(得分:2)

它记录在man bash

  

当使用旧式反引号替换形式时,反斜杠保留其字面含义,除非后跟$`或          \。第一个不带反斜杠的反引号会终止命令替换。使用$(command)表单时,全部          括号之间的字符组成命令;没有人受到特别对待。

更重要的区别在于它们如何嵌套:

echo $(echo $(echo a))
echo `echo `echo a``   # Wrong
echo `echo \`echo a\``

答案 1 :(得分:1)

后引号(``)和$()都可以用于命令替换,但它们之间存在细微差别。

以问题中提到的案例为例:

$echo `echo \\\\ `

第1和第3" \"将被视为转义,echo \\\\将被评估为" \\"

因此,上述命令等于:

$echo \\

第一个反斜杠被视为转义,因此输出为:

\

在$()的情况下,有一点棘手,$()中的内容将作为参数传递给外部命令。

举个例子:

$echo $(echo \\\\ )

$()内部的内容被评估为" \\",这与前一种情况相同。与众不同的是" \\"将直接传递给外部echo命令,第一个反斜杠不会被视为转义。

因此我们得到了输出:

\\