Bash:后台有多个 for 循环

Rad*_*led 8 bash background-process for parallelism

这是在后台启动多个顺序处理的正确方法吗?

for i in {1..10}; do
    for j in {1..10}; do
        run_command $i $j;
    done &
done;
Run Code Online (Sandbox Code Playgroud)

所有j后应相互给予处理i,但都i应该被同时处理。

Kus*_*nda 8

您拥有的外循环基本上是

for i in {1..10}; do
    some_compound_command &
done
Run Code Online (Sandbox Code Playgroud)

这将some_compound_command在后台启动 10 个并发实例。他们将开始尽可能快地,但不完全“都在同一时间”(即,如果some_compound_command需要短的时间,那么第一个可能是最后一个开始之前完成)。

some_compound_command恰好是一个循环的事实并不重要。这意味着您显示的代码是正确的,因为内循环的迭代j将按顺序运行,但内循环的所有实例(外循环的每次迭代一个i)将同时启动。

唯一要记住的是,每个后台作业都将在子 shell 中运行。这意味着cd在内循环的一个实例中对环境所做的更改(例如,对 shell 变量的值的修改、当前工作目录的更改等)在该特定后台作业之外将不可见。

您可能想要添加的是wait循环后的语句,以等待所有后台作业实际完成,至少在脚本终止之前:

for i in {1..10}; do
    for j in {1..10}; do
        run_command "$i" "$j"
    done &
done

wait
Run Code Online (Sandbox Code Playgroud)