综合 Bash 5.3 发布:命令替换不再 fork 子进程,MULTIPLE_COPROCS 默认启用

2026-09-15 21:02:47

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:控制路径名展开结果的排序方式,可选 namesizeblocksmtimeatimectimenumericnone,并支持升序/降序。
  • 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 对已终止的进程替换的处理有调整。
  • 新可加载内建kvstrptime
  • 新增 shopt 选项 bash_source_fullpath:让 Bash 把完整路径写进 BASH_SOURCE
  • 在 posix 模式下,test 的 `` 二元原语现在按字符串比较;posix 模式不再要求函数名是合法 shell 标识符。
  • 源码升级到 C23 规范:不再能用 K&R 风格 C 编译器编译 Bash。

GLOBSORTcompgen -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-completeforce-meta-prefix 变量强制用 ESC 作 meta 前缀。

落地建议

Bash 5.3 发布后不会马上进各发行版仓库。需要的话从源码编译,先装 build-essentiallibc6-devgccg++make。生产机建议先在虚拟机或测试机上验证,不要直接替换线上 shell。

复制全文 生成海报 Shell Bash Linux 版本发布

推荐文章

程序员茄子在线接单