Shell中如何正确实现多个变量的并行赋值
问题根因
问题和wait命令无关,核心逻辑错误在于:所有加&放到后台执行的命令,都会运行在独立的子shell环境中。子shell的变量作用域和父shell完全隔离,子shell内部的变量赋值不会同步到父shell,哪怕所有后台任务执行完毕,父shell中的对应变量从未被写入有效值,最终打印自然为空。
正确并行赋值实现
要实现并行执行命令、同时将输出赋值给父shell变量,最通用的方案是通过临时文件暂存每个后台任务的输出,等待所有任务执行完成后再读取内容赋值,可直接运行的示例代码如下:
# 创建临时目录存储各命令输出 tmp_dir=$(mktemp -d) # 并行启动所有版本查询任务,输出写入对应临时文件 node -v > "$tmp_dir/node" & npm -v | awk '{print "v"$0}' > "$tmp_dir/npm" & yarn -v | awk '{print "v"$0}' > "$tmp_dir/yarn" & curl --version | head -n 1 | awk '{print "v"$2}' > "$tmp_dir/curl" & # 等待所有后台任务执行完成 wait # 从临时文件读取结果赋值给变量 a_NODE=$(<"$tmp_dir/node") a_NPM=$(<"$tmp_dir/npm") a_YARN=$(<"$tmp_dir/yarn") a_CURL=$(<"$tmp_dir/curl") # 清理临时目录 rm -rf "$tmp_dir" # 打印结果 echo "Node: $a_NODE" echo "NPM: $a_NPM" echo "YARN: $a_YARN" echo "curl: $a_CURL"
方案特性
- 所有耗时查询任务并行启动,无串行等待开销,执行效率和初始写法完全一致
- 通过文件做中转,彻底绕过子shell与父shell的变量作用域隔离限制
- 所有任务执行完成后再统一读取结果,不会出现读取空值的时序问题
- 执行完成后自动清理临时文件,无系统垃圾残留
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

