如何知道从哪个 bash 版本可以使用内置函数?

如何知道从哪个 bash 版本可以使用内置函数?

是否可以bash从命令行知道特定内置程序的特定版本可用?是否只能通过浏览每个版本的发行说明才能实现,还是存在更简单的方法?

答案1

我认为没有办法询问 Bash 是为哪个版本添加了功能。我能想到的最接近的测试方法是使用BASH_COMPAT选项compatXY,不包括内置可用性(即使某些影响内置行为):

compat31

如果设置,Bash 会将其行为更改为 3.1 版,其中涉及条件命令运算符的带引号参数以及使用条件命令的和运算符=~时的特定于区域设置的字符串比较。 bash-4.1 之前的 Bash 版本使用 ASCII 排序规则和 strcmp(3); bash-4.1 及更高版本使用当前语言环境的排序规则序列和 strcoll(3)。[[<>

compat32

[[如果设置,Bash 会在使用条件命令<和运算符时将其行为更改为版本 3.2 中特定于区域设置的字符串比较>(请参阅上一项)以及中断命令列表的效果。 Bash 版本 3.2 及更早版本在由于中断而终止后继续执行列表中的下一个命令。

compat40

[[如果设置,Bash 会在使用条件命令<和运算符时将其行为更改为版本 4.0 中特定于区域设置的字符串比较>(请参阅 的描述compat31)以及中断命令列表的效果。 Bash 4.0 及更高版本中断列表,就像 shell 收到中断一样;以前的版本继续执行列表中的下一个命令。

compat41

如果设置,Bash 在 POSIX 模式下会将双引号参数扩展中的单引号视为特殊字符。单引号必须匹配(偶数)并且单引号之间的字符被视为引用。这是 4.1 版本之前的 POSIX 模式的行为。默认的 Bash 行为与以前的版本保持一致。

compat42

如果设置,Bash 不会使用引号删除来处理模式替换词扩展中的替换字符串。

compat43

如果设置的话,如果尝试使用带引号的复合数组赋值作为 的参数,Bash 不会打印警告消息declare,使单词扩展错误成为导致当前命令失败的非致命错误(默认行为是使它们导致 shell 退出的致命错误),并且在执行 shell 函数时不会重置循环状态(这允许 shell 函数中的 break 或 continue 来影响调用者上下文中的循环)。

compat44

如果设置,Bash 会在使用位置参数之前保存BASH_ARGV它们BASH_ARGC,无论是否启用扩展调试模式。

这确实没有太多的用例。对于检查版本信息以了解功能可用性的情况,通常的建议是直接检查功能(在本例中为内置功能)的可用性 - 毕竟,即使具有此功能的版本也可能在编译时将其禁用。

例如:

$ for s in bash /bin/bash; do
 for b in compopt help; do
  "$s" -c 'echo "$1" is $([[ $(type "$1" 2>/dev/null) =~ "shell builtin" ]] || echo not) a builtin in "$BASH_VERSION"' _ $b;
 done;
done
compopt is a builtin in 5.0.7(1)-release
help is a builtin in 5.0.7(1)-release
compopt is not a builtin in 3.2.57(1)-release
help is a builtin in 3.2.57(1)-release

相关内容