私がコメントするのに十分な評判を持っていない
、しかし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
を返します。条件式を導入すればどうでしょうか?私たちは、[: -ne: unary operator expected
エラーを取得しており、この
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
:
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
を使用してください。
編集:私は受け入れられた答えを修正しましたが、私は後世のためにこの説明を残しています。
いつものように、2番目のグーグルがこれを見つけました。http://www.unix.com/302268337-post4.html – Bittrance
http://stackoverflow.com/questions/32698407/kill-next-command-in-pipeline-on-失敗のbash/32699218#32699218は、この質問のやや鮮明なバージョンですが、間違いなく、より良い回答があります(質問は、パイプラインの右側に通知する方法を尋ねますが、受け入れられる回答は、親のシェルの状況)。 –