クリーン終了のゼロ以外の終了ステータス


15

問題のプログラムが正常に実行された場合、ゼロ以外の終了コードを返すことは許容されますか?たとえば、次の(のみ)を実行する単純なプログラムがあるとします。

プログラムはN個の引数を取ります。終了コードmin(N、255)を返します。Nはプログラムに対して有効であることに注意してください。

より現実的なプログラムは、異なることを示すプログラムを正常に実行するために異なるコードを返す場合があります。これらのプログラムは、代わりにこの情報を標準出力などの代わりにストリームに書き込む必要がありますか?

回答:


24

環境にもよりますが、スタイルが悪いと思います。

Unixライクシステムには、終了ステータス0が成功を示し、ゼロ以外の終了ステータスが失敗を示すという強力な規則があります。すべてではありませんが、一部のプログラムは、異なるゼロ以外の終了コードでさまざまな種類の障害を区別します。たとえばgrep、通常、パターンが見つかった場合は0、見つからなかった場合は1、見つからないファイルなどのエラーがあった場合は2(またはそれ以上)を返します。

この規則は、Unixシェルにほとんど組み込まれています。例えば、中shbashおよびその他のBourneのようなシェル、if文の扱い成功/真として0終了ステータス、および故障/偽としてゼロ以外の終了ステータス:

if your-command
then
    echo ok
else
    echo FAILURE
fi

MS Windowsでの慣習は似ていると思います。

今用途型破りの終了コードという独自のプログラムを書くことからあなたを止めるものは何も他に何もそれと対話するつもりはないが、あなたは十分に確立規約に違反していることに注意して、それがされている場合は特に、確かにありませんでした戻ってきて、後であなたをかみます。

プログラムがこの種の情報を返す通常の方法は、次の場所に出力することstdoutです。

status = $(your-command)
echo Result is $status

7
慣習を説明するために+1、そのアプローチは、私がset -eどこかに置いた場合、私のシェルスクリプトのほとんどを壊すでしょう。
ベンジャミンバニエ

同様にgrepdiff違いが見つかった場合は1を返します。エラーが発生した場合は> 1。
7heo.tk

6

環境が何を期待しているかに依存します。

ウィキペディアの不思議さのお気に入り:

OpenVMSでは、成功は奇数値で示され、失敗は偶数値で示されます。値は、制御ビット、ファシリティ番号、メッセージ番号、および重大度のサブフィールドを持つ32ビット整数です。重大度の値は、成功(成功、情報)と失敗(警告、エラー、致命的)に分けられます。


4

終了コードが意味のある関連情報を呼び出し元に返し、成功の定義が実際にはバイナリではない場合、前例があると思います。私が考えている先例は、何が起こったかに応じてたくさんの異なるものを返すrobocopyです。

このため、常にデバッグが必要になることを付け加えます-ほとんどのユーティリティは終了コード0 ==成功を前提としているので、robocopyが1を返すとき、ものをコピーしなかったが、コピーしなかったのでゼロではなかったのでおかしくなりますいずれかのエラーが発生します。


2

正常に実行された場合に0を返さないことは、プログラムを実行している人を混乱させる可能性があるため、悪い考えです。異なる入力でプログラムを100回以上実行し、失敗または成功した数を知りたい人がいる場合、単一の成功値があると、多くの異なる値を持つよりも違いを見つけるのがはるかに簡単になります。

すべてが異なるものを意味する可能性のある複数の成功したリターンパスを持つプログラムがある場合、それはあなたのプログラムが不十分に設計されているサインだと思います。


2

許容できると思うケースを知っています。私は、テスト失敗の総数で終了するテストフレームワークを知っています。そのため、たとえば、テストランナーが失敗したテストなしで完了した場合、ゼロで終了します。1つのテストが失敗した場合、テストランナー自体は正常に実行されましたが、1で終了します。2つが失敗した場合、2を返します。これは250になります。

250を超える終了コードを使用して、異常終了を示します。

これは慣習に違反しますが、実際にはうまく機能します。


3
これ慣習に違反するとは思わない-エラーがなければテストは成功する。ゼロ以外の結果コードは、失敗したテストを示します。
ベヴァン

1
それは「エラーステータスで終了して0個以上のエラーを示す」ことであり、終了ステータスの正確な一般的なセマンティクスに違反する可能性がありますが、大きな「0は問題ありません。 。
バティーン

2

それは本当にあなたがコードで伝えようとしているものに依存します。たとえば、DB2は、データが見つからない場合は100、警告の場合はその他のさまざまな正の値、エラーの場合は負の値を返します。Oracleも同様のことを行います。

したがって、異なる成功状態がある場合は、さまざまな戻り値を使用する価値があります。


2

良い例:man sa-update(spamassassin)

終了コード

  • 0の終了コードは、更新が利用可能であり、-checkonlyが指定されていない場合、正常にダウンロードおよびインストールされたことを意味します。
  • 終了コード1は、利用可能な最新の更新がないことを意味します。
  • 終了コード2は...を意味します

この場合、出口1は単なる情報コードです。ただし、コードを記述した場合、通常は主電源障害が発生するため、1は選択しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.