POSIX

POSIX

我在 youtube 上看过有关 POSIX 标准的有趣视频。

这是讲座的一部分,询问是否有人知道结果

echo \\\\\\

在 bash 和 sh(POSIX 标准?)

sh-3.2$ echo \\\\\\

\\

bash$ echo \\\\\\

\\\

我想再次找到那个视频,但找不到。

我就是不明白这是怎么发生的。

答案1

这变得有点复杂。其实有不同的情况:两个 POSIX 变体,以及 Bash 的作用。

首先,shell 处理您编写的内容。 POSIX shell 语言以及 Bash,支持反斜杠引用, 哪个

保留后续字符的字面值

So代表给定命令的参数中的\\一个。\

您的示例echo \\\\\\包含三对反斜杠。 shell 解释这些转义并给出三个反斜杠 ,作为(相当于)\\\的参数。echoecho '\\\'

在所有情况下,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也做同样的事情。


这意味着:

  1. 在 Bash 下,仅发生 shell 级解释,并且输出三个反斜杠。
  2. 在 POSIX/XSI 环境下,反斜杠被解释两次,你会得到两个反斜杠的输出。
  3. 在纯 POSIX 环境下,实现可以选择一种行为。您看到的输出版本都是允许的。
  4. 您可以使用 来将 Bash 配置为具有自动解释转义符的 XSI 行为shopt -s xpg_echo,但如果没有明确请求,则永远不会启用它。

相关内容