tmpbin Asked: 2017-12-01 07:22:47 +0800 CST2017-12-01 07:22:47 +0800 CST 2017-12-01 07:22:47 +0800 CST 为什么命令 echo `echo \\\z` 输出 \z? 772 该命令echo $(echo \\\z)来自书中 ,我不明白它为什么会输出 \z 我认为它应该输出 z bash quoting 2 个回答 Voted Best Answer Stéphane Chazelas 2017-12-01T07:37:11+08:002017-12-01T07:37:11+08:00 \是 shell 的引用运算符。当在其他类型的引号之外时,\x就像'x'(x换行符除外)。 所以: echo \\\x 就好像: echo '\''x' 或者 echo '\x' Soecho使用两个参数调用,一个包含echo(其名称),另一个包含\x. 根据 POSIX,echo当其任何操作数(命令名称以外的参数)包含反斜杠或其第一个操作数时的行为-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\z或no such escape sequence: \zor 一个 NUL 字符... 然而在实践中,我不知道任何可以理解\z为转义序列的实现,所以我发现我尝试过的所有实现都在\z<newline>那里输出。 如果您想要一种可移植且可靠的方式来输出文本,请不要使用echo,printf而是使用. Raman Sailopal 2017-12-01T07:36:58+08:002017-12-01T07:36:58+08:00 将语句 echo 拆分为多个部分 \ 是 bash 识别为转义的变量 因此 \ 正在转义字符“\”,因此打印 \ \z 正在转义字符“z”,因此打印 z 综合起来,我们有 \z
\
是 shell 的引用运算符。当在其他类型的引号之外时,\x
就像'x'
(x
换行符除外)。所以:
就好像:
或者
So
echo
使用两个参数调用,一个包含echo
(其名称),另一个包含\x
.根据 POSIX,
echo
当其任何操作数(命令名称以外的参数)包含反斜杠或其第一个操作数时的行为-n
是未指定的。您会发现即使在此之外,行为也会有所不同。根据 UNIX 规范(在上面的链接中应用了 XSI), 的行为
echo '\z'
也未指定,因为\z
它不是标准转义序列之一。使用 UNIX 兼容
echo
的 ,例如 的echo
内置bash -o posix -O xpg_echo
函数,您可以保证:如同:
或者:
将输出
\z<newline>
.除此之外,您不会得到 POSIX 的任何保证。
实现可以输出
z
or\z
或no such escape sequence: \z
or 一个 NUL 字符...然而在实践中,我不知道任何可以理解
\z
为转义序列的实现,所以我发现我尝试过的所有实现都在\z<newline>
那里输出。如果您想要一种可移植且可靠的方式来输出文本,请不要使用
echo
,printf
而是使用.将语句 echo 拆分为多个部分
\ 是 bash 识别为转义的变量
因此 \ 正在转义字符“\”,因此打印 \
\z 正在转义字符“z”,因此打印 z
综合起来,我们有 \z