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

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

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

\z

我认为它应该输出

z

答案1

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

所以:

echo \\\x

就好像:

echo '\''x'

或者

echo '\x'

Soecho使用两个参数调用,一个包含echo(其名称),另一个包含\x.

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

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

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

echo '\\z'

与...一样:

echo \\\\z

或者:

echo \\\\\z

将输出\z<newline>.

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

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

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

如果您想要一种便携且可靠的方式来输出文本,不使用echoprintf改用

答案2

将语句 echo 分成几部分

\ 是 bash 识别为转义的变量

因此 \ 正在转义字符“\”,因此打印 \

\z 转义字符“z”,因此打印 z

综合起来,我们有 \z

相关内容