プログラムはSTDERRに出力され、まだゼロ終了ステータスを返すことはできますか?

プログラムはSTDERRに出力され、まだゼロ終了ステータスを返すことはできますか?

私はコマンドラインで実行するように設計されたいくつかのPythonスクリプトをリファクタリングしています。これらのスクリプトはロギングを使用するため、一部のメッセージがSTDERRに書き込まれます。 LinuxのプログラムはSTDERRに出力しますが、まだ0(成功)終了ステータスを返すのが適切かどうか疑問に思います。終了状態がゼロでない場合にのみSTDERRを参照する必要があると思います。

PS デフォルトでは、スクリプトの出力をキャプチャし、終了状態とともに処理のために別のサービスに送信する必要があります。データが一貫していることを願っています。

答え1

はい、プログラムは標準エラーとして出力し、まだゼロ終了ステータスを返すことができます。多くのPOSIXユーティリティの仕様には、「標準エラーは次のようにのみ適用されます。診断情報。 」

STDERRに出力して0を返すプログラムの明確な例は次のとおりです。crontab。努力する

EDITOR=nano crontab -e 2> stderr.out; echo $?

cronファイルを変更しないでエディタを終了します。0エコーされますがstderr.out(私の場合)、次のメッセージが表示されます。

no crontab for user - using an empty one
No modification made

答え2

stderrファイル番号を持つ事前定義されたストリーム2。慣例は、重要な情報または代替情報(必ずしもエラーではない)を印刷することです。

curlたとえば、toによってトリガされたメッセージは、既に実際の結果を取得するために使用されているため、デフォルトで出力されます。したがって、終了コードが0になり、次のように出力されます。--verbosestderrstdoutstderr

$ curl ifconfig.me

$ curl --verbose ifconfig.me 2>messages.txt

一方、終了コードは次のとおりですsys.exit() (参照:_出口(2)そして出口(3))。 2つを結ぶルールはありません。取るgrepたとえば、エラーが発生すると出力されますが、stderr終了コードはフラグに従って調整できます。

通常、終了状態は、行が選択されている場合は0、行が選択されていない場合は1、エラーが発生した場合は2です。しかし、-qまたは--quietまたは --silent行を使用して選択すると、エラーが発生しても終了ステータスは0です。

答え3

まあ、私はまだこの質問が何を尋ねているのかわかりません。ところで、もう一度オープンしたので、以前に申し上げた内容を再び上げます。他の人(そして私)が言ったことを繰り返す危険があります。

  1. プログラムがstderrに書き込まれ、まだ状態0で終了することは確かに可能です。これはまれですが、悪い習慣とは見なされません。
  2. プログラムを実行するのが適切で安全かどうかが主な関心事である場合 N+1ショー終了後 窒素(およびその他の先行操作)がすでに終了している場合は、終了状態にのみ基づいて決定を下す必要があります。
  3. 注意を引くために異常をエスカレーションしたいが、よく文書化されていない場合は、 それからstderrを見てください。

関連情報