为什么命令 echo `echo \\\z` 输出 \z?

tmp*_*bin 2 bash echo quoting

该命令echo $(echo \\\z)来自书中 ,我不明白为什么会输出

\z

我认为它应该输出

z

Sté*_*las 6

\是 shell 的引用运算符。当在其他类型的引号之外时,\x就像'x'(除非x是换行符)。

所以:

echo \\\x
Run Code Online (Sandbox Code Playgroud)

就好像:

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

或者

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

Soecho用两个参数调用,一个包含echo(它的名称),一个包含\x.

根据 POSIXecho当其任何操作数(命令名称以外的参数)包含反斜杠或其第一个操作数时的行为-n是未指定的。您会发现,即使在此之外,行为也会有所不同。

根据 UNIX 规范(在上面的链接中应用 XSI), 的行为echo '\z'也未指定,因为\z它不是标准转义序列之一。

使用 UNIX 兼容的echo,例如 的echo内置bash -o posix -O xpg_echo,您可以保证:

echo '\\z'
Run Code Online (Sandbox Code Playgroud)

与...一样:

echo \\\\z
Run Code Online (Sandbox Code Playgroud)

或者:

echo \\\\\z
Run Code Online (Sandbox Code Playgroud)

将输出\z<newline>.

除此之外,您不会得到 POSIX 的任何保证。

实现可以输出zor\zno such escape sequence: \zor 一个 NUL 字符...

然而,在实践中,我不知道任何可以理解\z为转义序列的实现,所以我发现我尝试的所有实现都在\z<newline>那里输出。

如果您想要一种可移植且可靠的文本输出方式,请不要使用echoprintf而应使用