bash 函数变量在后台运行时是并行安全的吗?
Are bash function variables parallel-safe when backgrounded?
#!/bin/bash
function foo {
bar=$(cmd_1 )
baz=$(cmd_2 )
combine_results $bar $baz
}
for arg in $(get_arg_list);
do
foo &
done
bar
和 baz
的多个实例是否可以在 foo &
多次 运行 时互相破坏?或者这些变量是每个实例的局部变量?
Are bash function variables parallel-safe when backgrounded?
是的。
Can the multiple instances of bar and baz clobber each other when foo & is run many times?
没有。 (假设 cmd_1
和 cmd_2
和 combine_results
本身是“并行安全”执行的,因为它们不会输出“破坏”的结果)。所有 foo
进程写入相同的输出 - 输出可能是交错的(但不是“混乱的”,如“无效”或某些不确定的输出)。
Or are these variables local to each instance?
是的。 (本地,如进程本地。变量是全局的,即 ( foo ; echo $bar ) &
将打印函数内部设置的 bar
的值)。
每个子shell都是一个单独的进程,有自己的进程space和独立的execution environment。
你的变量扩展没有被引用。 for i in $(...)
是一种常见的 反 模式。请注意,您 不是 将任何参数传递给您的函数 -
未设置并且扩展为空。使用 shellcheck.net 检查您的脚本。
#!/bin/bash
function foo {
bar=$(cmd_1 )
baz=$(cmd_2 )
combine_results $bar $baz
}
for arg in $(get_arg_list);
do
foo &
done
bar
和 baz
的多个实例是否可以在 foo &
多次 运行 时互相破坏?或者这些变量是每个实例的局部变量?
Are bash function variables parallel-safe when backgrounded?
是的。
Can the multiple instances of bar and baz clobber each other when foo & is run many times?
没有。 (假设 cmd_1
和 cmd_2
和 combine_results
本身是“并行安全”执行的,因为它们不会输出“破坏”的结果)。所有 foo
进程写入相同的输出 - 输出可能是交错的(但不是“混乱的”,如“无效”或某些不确定的输出)。
Or are these variables local to each instance?
是的。 (本地,如进程本地。变量是全局的,即 ( foo ; echo $bar ) &
将打印函数内部设置的 bar
的值)。
每个子shell都是一个单独的进程,有自己的进程space和独立的execution environment。
你的变量扩展没有被引用。 for i in $(...)
是一种常见的 反 模式。请注意,您 不是 将任何参数传递给您的函数 - 未设置并且扩展为空。使用 shellcheck.net 检查您的脚本。