bash函数变量在后台是并行安全的吗?


#!/bin/bash
function foo {
bar=$(cmd_1 $1)
baz=$(cmd_2 $1)
combine_results $bar $baz
}
for arg in $(get_arg_list);
do
foo &
done

foo &多次运行时,barbaz的多个实例是否能够相互清洗?或者这些变量是每个实例的局部变量?

bash函数变量在后台是并行安全的吗?

是的。

bar和baz的多个实例在foo &是跑了很多次吗?

。(假设cmd_1cmd_2combine_results本身是"并行安全的";执行,就像它们不会输出一个&;clobered &;结果)。所有foo进程写入相同的输出—输出可以交错(但不能"乱码",如"无效")。或者一些不确定的输出)

或者这些变量是每个实例的本地变量?

是的。(本地的,也就是对过程本地的。变量是全局的,即。( foo ; echo $bar ) &将打印函数内部设置的bar的值)。

每个子shell都是一个独立的进程,有自己的进程空间和独立的执行环境。

变量展开没有引号。for i in $(...)是一种常见的模式。请注意,您没有向函数传递任何参数-$1未设置并展开为空。用shellcheck.net检查你的脚本

最新更新