tôi không có đủ uy tín để bình luận, nhưng accepted answer đã mất tích một bế mạc }
trên dòng 5.
Sau khi sửa chữa này, mã sẽ ném một lỗi -ne: unary operator expected
, mà điểm đến một vấn đề: PIPESTATUS
là ghi đè bởi điều kiện theo lệnh if
, vì vậy giá trị trả lại của process_commands
sẽ không bao giờ được kiểm tra!
Điều này là do [ ${PIPESTATUS[0]} -ne 0 ]
là equivalent totest ${PIPESTATUS[0]} -ne 0
, thay đổi $PIPESTATUS
giống như bất kỳ lệnh nào khác. Ví dụ:
return0() { return 0;}
return3() { return 3;}
return0 | return3
echo "PIPESTATUS: ${PIPESTATUS[@]}"
Điều này trả về PIPESTATUS: 0 3
như mong đợi. Nhưng nếu chúng ta giới thiệu điều kiện thì sao?
return0 | return3
if [ ${PIPESTATUS[0]} -ne 0 ]; then
echo "1st command error: ${PIPESTATUS[0]}"
elif [ ${PIPESTATUS[1]} -ne 0 ]; then
echo "2nd command error: ${PIPESTATUS[1]}"
else
echo "PIPESTATUS: ${PIPESTATUS[@]}"
echo "Both return codes = 0."
fi
Chúng tôi nhận được lỗi [: -ne: unary operator expected
, và điều này:
PIPESTATUS: 2
Both return codes = 0.
Để sửa lỗi này, $PIPESTATUS
nên được lưu trữ trong một biến mảng khác nhau, như vậy:
return0 | return3
TEMP=("${PIPESTATUS[@]}")
echo "TEMP: ${TEMP[@]}"
if [ ${TEMP[0]} -ne 0 ]; then
echo "1st command error: ${TEMP[0]}"
elif [ ${TEMP[1]} -ne 0 ]; then
echo "2nd command error: ${TEMP[1]}"
else
echo "TEMP: ${TEMP[@]}"
echo "All return codes = 0."
fi
nào in:
TEMP: 0 3
2nd command error: 3
như dự định.
Chỉnh sửa: Tôi đã sửa câu trả lời được chấp nhận, nhưng tôi để lại giải thích này cho hậu thế.
Như mọi khi, googling thứ hai tìm thấy http://www.unix.com/302268337-post4.html – Bittrance
http://stackoverflow.com/questions/32698407/kill-next-command-in-pipeline-on- fail-bash/32699218 # 32699218 là một phiên bản hơi rõ ràng hơn của câu hỏi này, được cho là, câu trả lời hay hơn (câu hỏi hỏi cách thông báo bên phải đường ống thất bại, nhưng câu trả lời được chấp nhận chỉ giải quyết cách phát hiện tình hình trong shell cha). –