Внешний цикл, который у вас есть, в основном
for i in {1..10}; do
some_compound_command &
done
Это приведет к запуску десяти одновременных экземпляров some_compound_command
в фоновом режиме. Они будут запущены как можно быстрее, но не совсем "все одновременно" (т.е. если some_compound_command
займет очень мало времени, то первый вполне может закончиться раньше, чем начнется последний ).
Тот факт, что some_compound_command
оказывается циклом, не важен. Это означает, что код, который вы показываете, является правильным в том, что итерации внутреннегоj
-цикла будут выполняться последовательно, но все экземпляры внутреннего цикла (по одному на итерацию внешнегоi
-Цикл )будет запущен одновременно.
Единственное, что нужно иметь в виду, это то, что каждое фоновое задание будет выполняться в подоболочке. Это означает, что изменения, внесенные в среду (, например. изменения значений переменных оболочки, изменения текущего рабочего каталога с помощью cd
и т. д. )в одном экземпляре внутреннего цикла не будут видны за пределами этого конкретного фонового задания.
Возможно, вы захотите добавить оператор wait
после цикла, просто чтобы дождаться фактического завершения всех фоновых заданий, по крайней мере, до завершения скрипта:
for i in {1..10}; do
for j in {1..10}; do
run_command "$i" "$j"
done &
done
wait