Answers:
你的外循环基本上是
for i in {1..10}; do
some_compound_command &
done
这将some_compound_command
在后台启动十个并发实例。他们将开始尽可能快地,但不完全“都在同一时间”(即,如果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
如果您具有GNU Parallel,则可以执行以下操作:
parallel -j0 'for j in {1..10}; do run_command {} $j; done' ::: {1..10}
好处之一是并行运行的输出run_commands
不会混合。