我可以查看 Bash POSIX 扩展吗?

我可以查看 Bash POSIX 扩展吗?

我正在阅读有关bashshell 的内容,并且从许多来源了解到,为了使其bash兼容 POSIX,它需要“扩展”。对我来说,这听起来像是我应该能够加载或卸载到 bash 中的东西。我尝试用谷歌搜索该主题,但似乎找不到有关该主题的任何详细信息。我能找到的东西基本上只是说“Bash 需要扩展”。

有没有办法可以查看 Bash 正在加载的扩展?加载或卸载它们?对它们进行不同的配置?

答案1

Bash 有许多超出或违背 POSIX 规定的功能和行为。这些有时被描述为标准的扩展;它们不是某些应用程序中意义上的可加载扩展。

这些扩展包括诸如[[测试语法,{a,b,c}大括号扩展,变量间接与${!x},过程替换为<(...),以及历史扩展!。扩展名是非 POSIX从这个意义上说,它是 Bash 的一部分。

它们还包括对命令和语法行为的各种更改。当使用 if 运行时,POSIX 脚本的行为可能有所不同bash,例如,它使用!将被解释为尝试历史扩展的字符,或者它依赖于命令后的命令前赋值语句:

foo() { ... ; }
x=1 foo
echo $x

在 POSIX 中sh,应该输出“ 1”,但运行时分配给bash的命令x在命令后不会保留,以避免在常见情况下使变量命名空间混乱。


重击有一个 POSIX 模式,可以将其行为更改为更像 POSIX在合理的 POSIX 脚本表现不同的情况下。除上述之外的一个例子是 Bash 的(非常有用的)time处理管道命令的扩展,它是必需内置的。在 POSIX 模式下,系统的time可执行文件在某些​​情况下运行:

$ time --help
bash: --help: command not found
$ set -o posix
$ time --help
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]

POSIX 模式下当前 56 种行为变化的列表在文档中。大多数其他扩展(例如[[${!x})即使在 POSIX 模式下仍然可以工作,尽管进程替换不能。大多数情况下,只有可能破坏合理 POSIX 脚本的差异才会被恢复。这确实是现有扩展的唯一“禁用”。在 POSIX 模式下,POSIX 脚本应该按预期运行(尽管仍然很容易构造出不按预期运行的情况)。即使在 POSIX 模式下,Bash 脚本也可以使用 shell 提供的一些与标准不直接冲突的非 POSIX 功能。


值得注意的是,还有其他 shelldash试图实现更最低限度的 POSIX 合规性。消除非 POSIX 扩展的主要方法是改用其中一种 shell。

答案2

有三种不同的方法可以强制bash遵守 POSIX。

  • bash--posix选项开始
  • 设置选项POSIX当 bash 已经运行时:set -o posix
  • 使用环境变量POSIXLY_CORRECT

    如果bash启动时这个变量在环境中,shell会进入POSIX模式在读取启动文件之前,就好像--posix 已经提供了调用选项一样。如果在 shell 运行时设置,bash 会启用POSIX模式,就像命令set -o posix已被执行一样。

使用这三者可以写一些扩大(例如在 bash 启动期间加载的函数),可能有人已经这样做了,但它们都不是 bash 标准。

相关内容