我沒有足夠的信譽發表評論,但accepted answer是缺少一個右}
第5行
固定在此之後,該代碼將拋出一個-ne: unary operator expected
錯誤,它指向一個問題:PIPESTATUS
是被if
命令後的條件覆蓋,所以返回值process_commands
將永遠不會被檢查!
這是因爲[ ${PIPESTATUS[0]} -ne 0 ]
是equivalent totest ${PIPESTATUS[0]} -ne 0
,它與其他任何命令一樣更改$PIPESTATUS
。例如:
return0() { return 0;}
return3() { return 3;}
return0 | return3
echo "PIPESTATUS: ${PIPESTATUS[@]}"
如預期的那樣返回PIPESTATUS: 0 3
。但是如果我們引入條件呢?
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
我們拿到的[: -ne: unary operator expected
錯誤,並且這樣的:
PIPESTATUS: 2
Both return codes = 0.
爲了解決這個問題,$PIPESTATUS
應存放在不同的數組變量,像這樣:
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
它打印:
TEMP: 0 3
2nd command error: 3
按照預期
。
編輯:我確定了接受的答案,但是我將這個解釋留給後代。
一如既往,第二次使用谷歌搜索發現這個http://www.unix.com/302268337-post4.html – Bittrance
http://stackoverflow.com/questions/32698407/kill-next-command-in-pipeline-on-失敗bash/32699218#32699218是一個稍微更清楚的版本,這個問題有可以說是更好的答案(問題是如何通知管道的右側失敗,但接受的答案只解決如何檢測父shell中的情況)。 –