問題のプログラムが正常に実行された場合、ゼロ以外の終了コードを返すことは許容されますか?たとえば、次の(のみ)を実行する単純なプログラムがあるとします。
プログラムはN個の引数を取ります。終了コードmin(N、255)を返します。Nはプログラムに対して有効であることに注意してください。
より現実的なプログラムは、異なることを示すプログラムを正常に実行するために異なるコードを返す場合があります。これらのプログラムは、代わりにこの情報を標準出力などの代わりにストリームに書き込む必要がありますか?
問題のプログラムが正常に実行された場合、ゼロ以外の終了コードを返すことは許容されますか?たとえば、次の(のみ)を実行する単純なプログラムがあるとします。
プログラムはN個の引数を取ります。終了コードmin(N、255)を返します。Nはプログラムに対して有効であることに注意してください。
より現実的なプログラムは、異なることを示すプログラムを正常に実行するために異なるコードを返す場合があります。これらのプログラムは、代わりにこの情報を標準出力などの代わりにストリームに書き込む必要がありますか?
回答:
環境にもよりますが、スタイルが悪いと思います。
Unixライクシステムには、終了ステータス0が成功を示し、ゼロ以外の終了ステータスが失敗を示すという強力な規則があります。すべてではありませんが、一部のプログラムは、異なるゼロ以外の終了コードでさまざまな種類の障害を区別します。たとえばgrep、通常、パターンが見つかった場合は0、見つからなかった場合は1、見つからないファイルなどのエラーがあった場合は2(またはそれ以上)を返します。
この規則は、Unixシェルにほとんど組み込まれています。例えば、中sh、bashおよびその他のBourneのようなシェル、if文の扱い成功/真として0終了ステータス、および故障/偽としてゼロ以外の終了ステータス:
if your-command
then
    echo ok
else
    echo FAILURE
fi
MS Windowsでの慣習は似ていると思います。
今用途型破りの終了コードという独自のプログラムを書くことからあなたを止めるものは何も他に何もそれと対話するつもりはないが、あなたは十分に確立規約に違反していることに注意して、それがされている場合は特に、確かにありませんでした戻ってきて、後であなたをかみます。
プログラムがこの種の情報を返す通常の方法は、次の場所に出力することstdoutです。
status = $(your-command)
echo Result is $status
              grep、diff違いが見つかった場合は1を返します。エラーが発生した場合は> 1。
                    終了コードが意味のある関連情報を呼び出し元に返し、成功の定義が実際にはバイナリではない場合、前例があると思います。私が考えている先例は、何が起こったかに応じてたくさんの異なるものを返すrobocopyです。
このため、常にデバッグが必要になることを付け加えます-ほとんどのユーティリティは終了コード0 ==成功を前提としているので、robocopyが1を返すとき、ものをコピーしなかったが、コピーしなかったのでゼロではなかったのでおかしくなりますいずれかのエラーが発生します。
許容できると思うケースを知っています。私は、テスト失敗の総数で終了するテストフレームワークを知っています。そのため、たとえば、テストランナーが失敗したテストなしで完了した場合、ゼロで終了します。1つのテストが失敗した場合、テストランナー自体は正常に実行されましたが、1で終了します。2つが失敗した場合、2を返します。これは250になります。
250を超える終了コードを使用して、異常終了を示します。
これは慣習に違反しますが、実際にはうまく機能します。
良い例:man sa-update(spamassassin)
終了コード
この場合、出口1は単なる情報コードです。ただし、コードを記述した場合、通常は主電源障害が発生するため、1は選択しません。
set -eどこかに置いた場合、私のシェルスクリプトのほとんどを壊すでしょう。