bash - bash 中 `set -o` 选项的预期有效顺序是什么? `histexpand` 胜过 `posix` 吗?

标签 bash set posix standards sh

几个小时前我试图回答一个问题,我认为它揭示了 bash POSIX mode 中的一个有点模糊的错误。 .我匆忙地强烈告诉我事实并非如此。自相矛盾的答案明确表示这不是错误,因此被选为正确答案。

所以我一直在梳理 bash 文档,但我仍然得到非常相同的印象,所以我想我应该问一下。

我的(所谓的)错误:

set -o histexpand(通常是隐式的)
设置-o posix
回显“#!/”

嗯,应该回显 #!/。 (它适用于任何其他外壳)。但是在 bash 中 打印到标准输出

!/: 事件未找到

然后返回0。

所以在我看来,bash 的隐式 set -o histexpand 在极少数情况下违反了 POSIX 标准,并且不会为 set -o posix

set -o posix 的文档阅读:

在默认操作不同于 POSIX 标准的情况下更改 Bash 的行为...这旨在使 Bash 的行为成为该标准的严格超集。

而且我一直认为这意味着当其他 set 选项相互矛盾时,这个选项应该取代它们? 这似乎不是 48 enumerated differences 之一任何一个。

不是这样的吗?我错过了什么?

最佳答案

来自Bash POSIX Mode reference期待您看到的行为 - 它没有在该列表的任何地方说明历史数字(PS1PS2 扩展之外) 将被区别对待 posix 集。此外,由于其他人说这不是错误,我猜“超集”的意思是只要没有特定于 Bash 的设置,shell 就会根据 POSIX 标准运行。

有趣的是,即使您运行 bash --noprofile --norc --posix,一些特定于 Bash 的设置在默认情况下也是打开的:

bash-4.2$ set -o | grep 'on$'
braceexpand     on
emacs           on
hashall         on
histexpand      on
history         on
interactive-comments    on
monitor         on
posix           on

POSIX Shell Command Language documentation 中均未提及这些(我先在 man bash 中查找了他们的简写),并且 interactive-comments 没有在任何地方提到

关于bash - bash 中 `set -o` 选项的预期有效顺序是什么? `histexpand` 胜过 `posix` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21496049/

相关文章:

linux - Bash for 循环参数意外行为

bash - 传送到命令 : is there any standard? 后尾随新行

linux - 用于构建蛋白质组数据的 Bash 代码

c - 如何在 Linux 中的进程之间交换二进制数据

perl - bash 彩色文本和管道

Java Maze Solver - 我从来没有这么卡过

c++ - 哈希集、 HashMap 和哈希表?

C# 属性 - 在 setter 访问器中添加逻辑

r - 两个 POSIXct 时间之间的中点

c - 文件名上的 Posix I/O 操作顺序一致吗?