在反引号中嵌套 echo 命令

在反引号中嵌套 echo 命令

我想知道为什么我的 shell 中会打印额外的回显。我使用的是bash4.2.46(1)版本。

echo `echo `echo $SHELL``

一个有趣的问题是,如果我替换'``'$()不会打印额外的回显:

echo $(echo `echo $SHELL`)

我发现它在奇数echo命令号中打印额外的回显:

echo `echo `echo `echo `echo $SHELL````

答案1

你的两个版本:

echo `echo `echo $SHELL``

echo $(echo `echo $SHELL`)

不等价。首先反引号命令替换一旦看到另一个反引号就结束:

当使用旧式反引号形式的替换时,[...] 前面没有反斜杠的第一个反引号将终止命令替换。

您的第一个版本实际上相当于:

echo $(echo )echo $SHELL$()

这就是为什么你在输出中得到“echo”的原因 - 你最终运行的命令(替换后并删除了额外的空格)只是:

echo echo /bin/bash

所以输出是“echo /bin/bash”,就像你直接写出该命令一样。


如果必须嵌套反引号,则可以反斜杠内部对来转义它们。您的第一个命令可以正确编写为:

echo `echo \`echo $SHELL\``

虽然我不推荐它——$( ... )它是为嵌套而设计的。

答案2

相当于

echo $(echo `echo $SHELL`)

或者,甚至更好:

echo $(echo $(echo $SHELL))

反引号中将是:

$ echo `echo \`echo $SHELL\``
/bin/sh

这正是反引号的主要问题:

 Where exactly does a backtick start or end?

这就是 shell 无法正确理解该行的原因。 shell 将该行理解为:

echo echo `echo $SHELL`

相关内容