Làm cách nào để đợi trong tập lệnh bash cho một số quy trình con được sinh ra từ tập lệnh đó để hoàn tất và trả về mã thoát! = 0 khi bất kỳ quy trình con nào kết thúc bằng mã! = 0?
Kịch bản đơn giản:
#!/bin/bash
for i in `seq 0 9`; do
doCalculations $i &
done
wait
Kịch bản trên sẽ chờ tất cả 10 quy trình được sinh ra, nhưng nó sẽ luôn đưa ra trạng thái thoát 0 (xem help wait
). Làm cách nào tôi có thể sửa đổi tập lệnh này để nó sẽ phát hiện trạng thái thoát của các quy trình con được sinh ra và trả về mã thoát 1 khi bất kỳ quy trình con nào kết thúc bằng mã! = 0?
Có giải pháp nào tốt hơn cho việc đó ngoài việc thu thập các PID của các quy trình con, chờ chúng theo thứ tự và tổng các trạng thái thoát?
wait -n
có một vấn đề nhỏ: nếu không còn công việc con nào (còn gọi là điều kiện chủng tộc), nó sẽ trả về trạng thái thoát không bằng 0 (không thành công) có thể không thể phân biệt được với quy trình con không thành công.
wait -n
, có sẵn trong bash hiện đại để chỉ quay lại khi lệnh đầu tiên / tiếp theo hoàn thành.