Bash

Bash:後台的多個 for 循環

  • October 3, 2019

這是在後台啟動多個順序處理的正確方法嗎?

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

j對於給定的,所有應該一個接一個地處理i,但所有i應該同時處理。

你擁有的外循環基本上是

for i in {1..10}; do
   some_compound_command &
done

這將some_compound_command在後台啟動十個並發實例。它們將盡可能快地啟動,但不是完全“同時”(即,如果some_compound_command花費很少的時間,那麼第一個可能會在最後一個開始之前完成)。

some_compound_command恰好是一個循環的事實並不重要。這意味著您顯示的程式碼是正確的,因為內部循環的迭代j將按順序執行,但內部循環的所有實例(外部循環的每次迭代一個i)將同時啟動。

唯一要記住的是,每個後台作業都將在子外殼中執行。這意味著在內部循環的一個實例中對環境所做的更改(例如對 shell 變數值的修改、目前工作目錄的更改cd等)在該特定後台作業之外將不可見。

您可能想要添加的是wait循環之後的語句,只是為了等待所有後台作業實際完成,至少在腳本終止之前:

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

wait

引用自:https://unix.stackexchange.com/questions/544861