几个小时前我试图回答一个问题,我认为它揭示了 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我会期待您看到的行为 - 它没有在该列表的任何地方说明历史数字(PS1
和 PS2
扩展之外) 将被区别对待 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/