失敗した猫は1を返し、他の失敗した猫は2を返すのはなぜですか?

失敗した猫は1を返し、他の失敗した猫は2を返すのはなぜですか?

考慮事項:(Linux / BASHを使用して、UNIXが正しいかどうかわからない)

存在しないファイルについて議論すると、2つのエラーが予想されました。

grep "i am here" real-file

# Returns: 0 (via: echo $?)

grep "i am not here" real-file

# Returns: 1

grep "i am not here" not-a-file

# Returns: 2 (No such file or directory)

ls real-files

# Returns: 0

ls not-files

# Returns: 2 (No such file or directory)

…みんな言葉になるけど…

cat real-files

# Returns: 0

cat not-files

# Returns: 1 (No such file or directory)

...「該当するファイルやディレクトリはありません」は終了ステータス2のSTDERRではないはずですか?

状態2にはファイルがあり、grepファイルlsはありませんが、cat同じエラーメッセージで1を返します。

私はgrep3つの可能な結果(上記のそれぞれ)があることを知っていますが、2つのlsことがあると思いますcat。したがって、2つの考えられる結果は原因にはなりませcatls

BASHコードに問題がありますか? LinusとRichardに電話する必要がありますか?これが正しい場合は、その理由を理解するのに役立ちます。


回答を受け入れた後、元の質問を拡張する回答が必要です。これはUNIXではなくLinux/BASHだからです。正しい:UNIX(Macなど)は同じことをしますか、それとも同じことをしますか?

ベストアンサー1

下から上にいくつかの部分をカバーし、重要でない部分を最初に削除してみましょう。

BASHコードに問題がありますか?

いいえ、一部のシェル構成で指摘したように、cat完全にスタンドアロンのバイナリアプリケーションです。bashスティーブン・チャジェラスcat組み込み可能ですが、アプリケーションの戻り状態は、アプリケーションがシェル関連かどうかとは完全に独立しています。

LinusとRichardに電話する必要がありますか?これが正しい場合は、その理由を理解するのに役立ちます。

いいえ、それは問題ではありません。 LinusとRichardはここでは何もしません。まあ、訂正します。いつか彼らはerrnoexit()とerrnoが絶対に関連するべきであると言い、何らかの奇妙な理由で私たちは彼らのすべての技術的決定に従うべきだと言わない限り。


両方のアプリケーションが異なる終了状態を返すことはまったく問題ではありません。POSIX 仕様には、「ゼロ以外の終了状態がこれを意味する」という明示的な制限や割り当てはありません。

シャットダウンシステムコールのPOSIXドキュメント状態:

ステータス値は0、EXIT_SUCCESS、EXIT_FAILURE、またはその他の値ですが、待機している親プロセスには最下位8ビット(つまりステータスと0377)のみを使用できます。

これは状態0のみが指定された意味を持ち、これは次のようにEXIT_SUCCESSに割り当てられることを意味します。標準ライブラリファイルメガネ。しかし、これはPOSIX仕様です。 Linux仕様はどのように比較されますか?まあ、ほぼ同じです:Linux出口(3)マニュアルには可能な値も指定されていません。

また、「~しなければならない」ではなく「~であるかもしれない」と書かれていることに注意してください。アプリケーションが特定の値で終了する必要はありません。、エラーが発生しても。アプリケーションでエラーが発生または失敗する可能性がありますが、まだゼロで終了します。

ただし、POSIX仕様はすべてのポータブルアプリケーション用EXIT STATUS部分が実際に指定されました。各アプリケーションによって異なります。繰り返しますが、成功の場合はゼロ以外のパターンはなく、他の場合はゼロ以外のパターンはありません。例えば、POSIX猫仕様必要:

The following exit values shall be returned:

0    All input files were output successfully.

>0   An error occurred.

~のためgrep私たちは:

The following exit values shall be returned:

 0    One or more lines were selected.
 1    No lines were selected.
>1    An error occurred.

Linux環境では猫(1)これらの状態値は明示的に明示されていませんが、GNUドキュメントは正規表現(1)マニュアルには終了コード2を使用することが言及されていますが、POSIX実装には0より大きいエラー条件のみが必要であることを認めています。 「と呼びかけます。


exit()場合によっては、状態値が次のと仮定することは言及する価値があります。エラー番号値。これまでPOSIXでこれを要求しているという文書や参考資料が見つかりませんでした。実際には、その逆は事実です。 POSIXに注目してください出口規範とLinux出口(3) マニュアルページ欲しくない終了状態が何らかの方法で errno と一致する必要があることを明示的に示します。したがって、戻り値2とGNUのgrepENOENTエラー値2との一致は純粋に偶然です。

実際に考えてみるとエラー番号 特定の整数値を割り当てる必要さえなく、実装によって異なります。したがって、 ENOENT を整数 2 として扱う Unix と同様の実装がある可能性が高いです。しかし、終了状態とerrnoは異なるため、これはまったく関係ありません。

要約すると:

実際にcat返される終了コードはgrep異なり、そのアプリケーションの仕様と一致し、適切です。終了コードの意味は固定されておらず、個々のアプリケーションによって異なります(catまたはPOSIXアプリケーション以外grepの場合は移植性のために従う必要があります)。

見積もりGNUオペレーティングシステムのドキュメント: 「最も一般的なルールは、0は成功を意味し、1は失敗を意味します.比較を実行するプログラムは別のルールを使用します.次のような場合、プログラムは既存の規則に従う必要があります。

おすすめ記事