失敗した終了状態を生成する迅速で宣言的な方法を考えて、ゼロに分割するというアイデアが浮上しました。bc
良い考えになります。
ランタイムエラーが発生しましたが、終了ステータスがまだゼロであるという事実に驚きました。
$ echo 41 + 1 | bc
42
$ echo $?
0
$ echo 42/0 | bc
Runtime error (func=(main), adr=6): Divide by zero
$ echo $?
0
- ゼロ以外の終了状態のためにbcユーティリティが失敗しないのはなぜですか?
注:ゼロ以外のクイックシャットダウン状態には、以下を使用しています。return 1
さらに、シェルチップ:
$ expr 1 / 0
expr: division by zero
$ echo $?
2
答え1
bc
実装された戻り状態はわずかに異なりますが、一般的なアイデアは、有効な入力を提供するとbc
状態0で終了することです。42/0
有効な入力です。構文上有効な式であっても読み取りエラーがないため、bc
ゼロが返されます。他のジョブの2行目を渡すと、そのジョブがbc
実行されます。これはexpr
、単一の算術式を評価する目的とは異なります。ここでは、単一式の結果によって戻り状態が決まります。
失敗を示す終了ステータスを生成する最も簡単な方法は、を呼び出すことですfalse
。これはexpr 1 / 0
難読化されたプログラミングコンテストでのみ可能です。
答え2
より仕様;これは予想される動作です。
すべての入力が正しく読み取られ、終了bc
ステータス0が生成されます。
bc
たとえば、存在しないファイルで実行すると、bc nosuchfile
他の終了ステータスが表示されます。
ゼロ以外の終了状態を説明するためにls somefile
合計を比較するls nosuchfile
か、次のように終了状態1と2(1は予想エラーまたは失敗状態、2は予期しないエラー)の一般的な使用を示します。
$ echo hello > file1
$ echo hello > file2
$ echo goodbye > file3
$ cmp -s file1 file2
$ echo $?
0
$ cmp -s file1 file3
$ echo $?
1
$ cmp -s file1 file4
$ echo $?
2
$