Vòng lặp bên ngoài mà bạn có về cơ bản là
for i in {1..10}; do
some_compound_command &
done
Điều này sẽ bắt đầu mười trường hợp đồng thời some_compound_command
trong nền. Chúng sẽ được bắt đầu nhanh nhất có thể, nhưng không hoàn toàn "tất cả cùng một lúc" (nghĩa là nếu some_compound_command
mất rất ít thời gian, thì lần đầu tiên có thể kết thúc tốt trước khi lần cuối cùng bắt đầu).
Thực tế some_compound_command
là một vòng lặp không quan trọng. Điều này có nghĩa là mã mà bạn hiển thị là chính xác trong các lần lặp của j
vòng trong sẽ được chạy tuần tự, nhưng tất cả các phiên bản của vòng lặp bên trong (một lần lặp của i
vòng ngoài ) sẽ được bắt đầu đồng thời.
Điều duy nhất cần ghi nhớ là mỗi công việc nền sẽ được chạy trong một lớp con. Điều này có nghĩa là những thay đổi được thực hiện cho môi trường (ví dụ: sửa đổi giá trị của các biến shell, thay đổi của thư mục làm việc hiện tại cd
, v.v.) trong một phiên bản của vòng lặp bên trong sẽ không hiển thị bên ngoài công việc nền cụ thể đó.
Những gì bạn có thể muốn thêm là một wait
tuyên bố sau vòng lặp của bạn, chỉ để chờ cho tất cả các công việc nền thực sự kết thúc, ít nhất là trước khi tập lệnh kết thúc:
for i in {1..10}; do
for j in {1..10}; do
run_command "$i" "$j"
done &
done
wait