bcを0で割ると0が終了するのはなぜですか?

bcを0で割ると0が終了するのはなぜですか?

失敗した終了状態を生成する迅速で宣言的な方法を考えて、ゼロに分割するというアイデアが浮上しました。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
$ 

関連情報