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_commandtrong 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_commandmấ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_commandlà 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 jvò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 ivò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 waittuyê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