6.12 shell 兼容模式(Shell Compatibility Mode)

Bash-4.0 引入了一个 shell 兼容级别的概念,其指定的是 shopt 内建命令的一个选项集合(compat31、compat32、compat40、compat41 等等)。只有一个当前兼容级别生效,即每个选项是互斥的。兼容模式的意图在于允许用户选择使用以前版本的行为,这样在将脚本迁移到与之不兼容的更新版本时可以使用其特性和行为。这只是一个临时解决方案。

这节没有涉及特别版本的行为标准(例如,设置级别 compat32 意味着将正则匹配操作符的右侧操作数引起来就是将在单词中的特殊正则字符引起来,其作为 bash-3.2 及以上版本的默认行为)。

如果一个用户启用了,比如说 compat32,其可以影响到当前兼容级别以及之前的所有其它兼容级别的行为。这个思想是让每一个兼容级别可在该 Bash 版本中控制改变其行为,但这个行为可能只存在于更早的版本中。例如,对于“[[”命令使用基于本地语言的比较是在 bash-4.1 出现的,更早版本是基于 ASCII 的比较,所以在 bash-4.1 中开启 compat32 也会开启基于 ASCII 的比较。这种粒度可能不会满足所有的使用需求,所以作为用户应该小心的选择兼容级别。阅读特定特性文档可以获知其行为。

Bash-4.3 引入了一个新的 shell 变量:BASH_COMPAT。分配给该变量的值(像 4.2 这样的十进制小数,或一个对应于 compatNN 选项中的整数,像 42)确定了兼容级别。

在 bash-4.4 之后,Bash 开始不赞成使用更老版本的兼容级别。最终,这些选项都移入到 BASH_COMPAT 变量中。

Bash-5.0 是可使用单一 shopt 选项设置之前兼容版本的最后一版。用户在 bash-5.0 和之后版本应该使用 BASH_COMPAT 变量进行兼容设置。

下列列表描述的是对于每一个兼容级别的行为变化控制。标记“compatNN”是使用下列机制中的一个来设置到兼容级别“NN”的快捷方式。在 bash-5.0 以前的版本,可以设置相应“compatNN”的 shopt 选项来设置兼容级别。在 bash-4.3 及以后版本,推荐使用 BASH-COMPAT 变量,并且该访求是在 bash-5.1 及以后版本必须使用的。

compat31

compat32

compat40

compat41

compat42

compat43

compat44

compat50(设置使用 BASH_COMPAT)