#!/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 &
多次运行时,bar
和baz
的多个实例是否能够相互清洗?或者这些变量是每个实例的局部变量?
bash函数变量在后台是并行安全的吗?
是的。
bar和baz的多个实例在foo &是跑了很多次吗?
。(假设cmd_1
、cmd_2
和combine_results
本身是"并行安全的";执行,就像它们不会输出一个&;clobered &;结果)。所有foo
进程写入相同的输出—输出可以交错(但不能"乱码",如"无效")。或者一些不确定的输出)
或者这些变量是每个实例的本地变量?
是的。(本地的,也就是对过程本地的。变量是全局的,即。( foo ; echo $bar ) &
将打印函数内部设置的bar
的值)。
每个子shell都是一个独立的进程,有自己的进程空间和独立的执行环境。
变量展开没有引号。for i in $(...)
是一种常见的反模式。请注意,您没有向函数传递任何参数-$1
未设置并展开为空。用shellcheck.net检查你的脚本