我正在阅读有关bash
shell 的内容,并且从许多来源了解到,为了使其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 标准。