有人可以解释命令替换中反斜杠的奇怪行为吗?

有人可以解释命令替换中反斜杠的奇怪行为吗?

我发现在 bash 中

echo `echo \\`

输出 \

\

echo `echo \\ `

什么也不输出

答案1

反斜杠样式命令替换中反斜杠的记录行为是:

当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非后跟“$”、“`”或“\”。

也就是说,反斜杠会避开美元符号、反引号和其他反斜杠在将命令交给 shell 进行处理之前(包括在反斜杠转义和引号的普通处理之前)。这意味着:

`echo \\ `

相当于

$(echo \ )

并输出一个空格。该单个空格作为参数插入到 external 中echo,然后通常在字段分割期间丢失,因此只是echo不带参数的裸运行。

另一方面

`echo \\`

\在命令末尾留下一个悬空,这通常是不合法的(它会指示在其他地方继续行),并且它被视为文字。bash和都dash这样做,就像 一样tcsh,但zsh没有。似乎没有明确指定在 POSIX 中或其他地方,所以我认为这是实现定义的行为。


相反,使用$( ... )命令替换可以让您在其中编写任何脚本而不会受到干扰。它几乎总是比反引号替换更好。

相关内容