2017-10-21 1 views
0

を終え、私は短い私のbashスクリプトでしょう:「?エコー」=bashの「-e」パズル:スクリプトファイルは、物事を明確にするために、予想外に

#!/bin/bash -e 

p_time=$(expr 0 - 0) 
echo ? 
echo "process time(sec) is: " ${p_time} 

ファイルには、前に終わるだろうが、私は」p_timeを変更した場合$(expr 0 - 0) "を" p_time = $(expr 3 - 0) "に変更すると、ファイルは正しく終了します。
しかし、最初の文で "-e"を削除しても、ファイルは正しく終了しています。
なぜこれが起こりますか?

+1

これは、多くの人が '-e'オプションを使用しないことを推奨する理由の1つです。ゼロ以外の終了コードが必ずしも*エラー*を示すとは限りません。 – chepner

+0

'set -e'の動作がどれほど穏やかで予測可能なのか疑問がある場合は、[BashFAQ#105](http://mywiki.wooledge.org/BashFAQ/105)の演習や、別のシェルの実装間の非互換性を示す表を見てください。https://www.in-ulm.de/~mascheck/various/set-e/ –

+1

ところで、 'expr'は1970年代の遺物であり、現代のスクリプトで使用されることはありません。 'p_time = $((0 - 0))'は、1991 POSIX.2標準に準拠するすべてのシェルで動作することが保証されています(これはfork()を避けるため)。 –

答えて

2

bash -eExit immediately if a command exits with a non-zero status.

0 - 0の結果は0であることを意味するので、expr 0 - 0の終了コードは1であり、bashは直ちに終了します。 -eを削除すると、Bashは終了コードexpr 0 - 0を無視し、スクリプト内のすべてのコマンドを実行します。

関連する問題