2017-01-20 11 views
2

どのようにこのbashの動作を説明できますか? 「& &」の文を終了しないでください。bash -eフラグと '&&' listコマンド

# bash -xe 
bash-4.1# trap 'echo ERROR' ERR 
+ trap 'echo ERROR' ERR 
bash-4.1# false && true 
+ false 
bash-4.1# false && false 
+ false 
bash-4.1# false || true 
+ false 
+ true 
bash-4.1# false || false 
+ false 
+ false 
++ echo ERROR 
ERROR 

答えて

5

man bashset -e言う慎重に読む:

失敗したコマンドをすぐにしばらく次またはキーワードまで、コマンドリストの一部である場合、シェルは、次のテストの一部、終了しません場合や予約語のelif、最終&&又は||次のコマンドを除い&&又は||リストで実行される任意のコマンドの一部[...]

強調鉱山。

詳細な説明:false && falseを実行すると、最初のfalseは、ショートが原因でコマンド全体が失敗し、コマンドの最後のコマンドではないため、終了ステータスは無視されます。 false || falseの場合、最初のfalseは、2番目のfalseを実行しますが、失敗しますが、終了ステータスは無視されません。これは、構成の最後のコマンドです。

+0

これは私の削除された答えに含まれているものです(あなたが見ることができればと思っています)が、私は今まで理解できません。 'false'は同じシナリオで親シェルから' trap 'を引き起こしていますので、気をつけてください。ありがとう! – Inian

+2

@Inian: 'false && false'を実行すると、最初の' false'は、短絡のためにコマンド全体が失敗し、最後のコマンドではないので、終了ステータスは無視されます。 'false ||の場合'false'の場合、最初の' false'は2回目の 'false'の実行に失敗しますが、終了ステータスは無視されません。 – choroba

+0

'man'のページでこれを見つけることができませんでした。これは' + 10 'の価値があります。私はこれをブックマークすることができるように、あなたが将来の参照のために答えにそれを加えることができればいいでしょう。ありがとう! – Inian