ilk*_*chu 5

反斜杠有效地为您提供了反斜杠的双重处理。(一次是主命令行被处理,另一次是命令替换中的命令。)

就像 Kusalanda 所说的那样,$(..)命令替换是不同的。

首先,让我们注意我们似乎在谈论 Bash 的echo,默认情况下它不处理反斜杠转义本身,因此例如echo '\\'传递\\echowhich prints \\。如果您使用echo处理反斜杠本身的an (如 Bash with shopt -s xpg_echo、或 Dash 或 zsh),您将得到最后一个\\变成\and\z作为输出。


Bash 的手册说

当使用旧式反引号替换形式时,反斜杠保留其字面含义,除非后跟 [美元符号、反引号或反斜杠]。

所以,在命令中

echo `echo \\\\\\\z`      # 7 backslashes
Run Code Online (Sandbox Code Playgroud)

\\对获得第一缩小到个\s,并且\z保持原样\z(它不跟任何三个,让反斜线是文字)。然后反引号中的命令再次通过 shell。

所以命令替换中的命令最终为

echo \\\\z                 # 4 backslashes
Run Code Online (Sandbox Code Playgroud)

其中\\成对减少为单个\s,并且参数echo变为\\z(通过两个echos打印不变,请参阅上面的警告)。

您可以使用美元符号看到类似的结果,例如:

var=foo
echo `echo \$var`
Run Code Online (Sandbox Code Playgroud)

打印foo

POSIX 还有一个奇怪的单引号例子

echo `echo '\$x'`
Run Code Online (Sandbox Code Playgroud)

打印$x。(单引号不保护$


$(...)命令替换的形式更合理,它的内容只处理一次,所以:

echo $(echo \\\\\\\z)           # 7 backslashes
Run Code Online (Sandbox Code Playgroud)

打印\\\z(3) 和

var=foo
echo $(echo \$var)
Run Code Online (Sandbox Code Playgroud)

打印$var

另见: