我在 youtube 上看过有关 POSIX 标准的有趣视频。
这是讲座的一部分,询问是否有人知道结果
echo \\\\\\
在 bash 和 sh(POSIX 标准?)
sh-3.2$ echo \\\\\\
\\
bash$ echo \\\\\\
\\\
我想再次找到那个视频,但找不到。
我就是不明白这是怎么发生的。
答案1
这变得有点复杂。其实有三不同的情况:两个 POSIX 变体,以及 Bash 的作用。
首先,shell 处理您编写的内容。 POSIX shell 语言以及 Bash,支持反斜杠引用, 哪个
保留后续字符的字面值
So代表给定命令的参数中的\\
一个。\
您的示例echo \\\\\\
包含三对反斜杠。 shell 解释这些转义并给出三个反斜杠 ,作为(相当于)\\\
的参数。echo
echo '\\\'
在所有情况下,echo
命令都会获得相同的参数,但它们对其的解释不同。
POSIX
有一个可选的 POSIX 扩展(XSI,或 X/开放系统接口),如今已得到广泛支持。不支持 XSI 也可以符合 POSIX,这在这种情况下会有所不同。
与XSI,echo
要求在参数内解释反斜杠转义, 包括
\\ Write a <backslash> character.
不带 XSI,POSIX 相反指出
如果第一个操作数是 -n,或者任何操作数包含 <反斜杠> 字符,则结果是实现定义的。
因此没有指定特定的结果(或者,您看到的两个版本都是允许的)。
POSIX/XSIecho
会将第一对反斜杠解释为转义本身,从而产生\\
输出。
重击
Bash 的内置echo
另一方面,除非您提供-e
明确要求的选项,否则不会解释转义序列。
在Bash 的 POSIX 模式,在各种情况下启用(包括当它作为 调用时sh
),它仍然做同样的事情(这是允许的“实现定义”行为)。如果您xpg_echo
使用 启用该选项shopt -s xpg_echo
,或者您的bash
可执行文件是使用配置选项构建的--enable-xpg-echo-default
,您将获得 POSIX/XSI 行为。
GNU coreutilsecho
也做同样的事情。
这意味着:
- 在 Bash 下,仅发生 shell 级解释,并且输出三个反斜杠。
- 在 POSIX/XSI 环境下,反斜杠被解释两次,你会得到两个反斜杠的输出。
- 在纯 POSIX 环境下,实现可以选择一种行为。您看到的输出版本都是允许的。
- 您可以使用 来将 Bash 配置为具有自动解释转义符的 XSI 行为
shopt -s xpg_echo
,但如果没有明确请求,则永远不会启用它。