我想知道为什么我的 shell 中会打印额外的回显。我使用的是bash
4.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`