Bash 5.3 发布:命令替换不再 fork 子进程,MULTIPLE_COPROCS 默认启用
Bash 5.3 于 2025 年 7 月发布,距 Bash 5.2 已经三年。这一版自带 Readline 8.3。
参考来源:
- 官方 CHANGES/NEWS:
- LWN 报道:
- Phoronix 报道:
最值得注意:两种不 fork 的命令替换
x=${ command; } # 在「当前 shell 执行上下文」里跑命令并捕获输出,不 fork、不走管道
${| command; } # 同样在当前 shell 执行,结果留在 REPLY 变量里
这两种形式都省掉了传统 $(...) 的子 shell 与管道开销:命令直接在当前的 shell 执行上下文里跑,输出被捕获下来。${ command; } 把结果赋给变量;${| ...; } 则把结果写进 REPLY,行为与 read 不带变量名时一致。
对频繁做命令替换的脚本来说,这是省掉一层 fork 的实打实改动。
其他新特性
- GLOBSORT:控制路径名展开结果的排序方式,可选
name、size、blocks、mtime、atime、ctime、numeric、none,并支持升序/降序。 compgen -V varname:把生成的补全结果存进指定变量,而不是打到 stdout。read -E:使用 readline,并启用默认 bash 补全(含 programmable completion)。source -p PATH:用PATH参数替代$PATH去搜索要 source 的文件。trap -P:打印每个信号参数对应的 trap 动作。- 新动态变量:
BASH_MONOSECONDS(单调时钟秒数)、BASH_TRAPSIG(当前 trap 对应的信号编号)。 array_expand_once:新的shopt选项,取代assoc_expand_once。- 命令计时精度从 3 位提高到最多 6 位。
MULTIPLE_COPROCS现在默认启用;wait -n对已终止的进程替换的处理有调整。- 新可加载内建:
kv、strptime。 - 新增
shopt选项bash_source_fullpath:让 Bash 把完整路径写进BASH_SOURCE。 - 在 posix 模式下,
test的 `` 二元原语现在按字符串比较;posix 模式不再要求函数名是合法 shell 标识符。 - 源码升级到 C23 规范:不再能用 K&R 风格 C 编译器编译 Bash。
GLOBSORT 和 compgen -V 是脚本里最容易用上的两个;read -E 对写交互式工具的人也比较实用,等于一行拿到带补全的输入。
Readline 8.3 新增
search-ignore-case:增量/非增量历史搜索可忽略大小写。execute-named-command:从标准输入读一个 readline 命令名并执行,emacs 模式默认绑定M-x。export-completions:把某个词的候选补全以固定格式写到 stdout,供其他进程消费。rl_full_quoting_desired:让所有补全都按文件名规则加引号;complete/compopt新增fullquote选项。- 新 bindable 命令名
bash-vi-complete;force-meta-prefix变量强制用 ESC 作 meta 前缀。
落地建议
Bash 5.3 发布后不会马上进各发行版仓库。需要的话从源码编译,先装 build-essential:libc6-dev、gcc、g++、make。生产机建议先在虚拟机或测试机上验证,不要直接替换线上 shell。