ここには2つの関連する問題があります。
最初に、OPの質問、なぜシェルでは0はtrueですがfalseは1ですか?2番目に、なぜアプリケーションは成功した場合に0を返し、失敗した場合にゼロ以外を返すのですか?
OPの質問に答えるには、2番目の質問を理解する必要があります。この投稿に対する多数の回答は、これが慣習であることを説明しており、この慣習が提供する優れた点のいくつかをリストしています。これらの機能のいくつかを以下にまとめます。
アプリケーションが成功すると0を返し、失敗するとゼロ以外を返すのはなぜですか?
操作を呼び出すコードは、操作の終了ステータスについて2つのことを知る必要があります。操作は正常に終了しましたか?[* 1]そして、操作が正常に終了しない場合、なぜ操作が正常に終了しなかったのですか?任意の値を使用して成功を表すことができます。ただし、0はプラットフォーム間で移植可能であるため、他のどの数値よりも便利です。2011年8月16日のこの質問に対するxiboの回答の要約:
ゼロはエンコーディングに依存しません。
one(1)を32ビット整数ワードに格納する場合、最初の質問は「ビッグエンディアンワードかリトルエンディアンワードか?」で、「リトルエンディアンワードを構成するバイトの長さはどのくらいですか?」 "、ゼロは常に同じに見えますが。
また、一部の人々はerrnoをある時点でcharまたはshortにキャストしたり、浮動にしたりすることも予想されます。(int)((char)ENOLCK)は、charが少なくとも8ビット長でない場合(7ビットASCII charマシンはUNIXでサポートされています)、ENOLCKではありませんが、(int)((char)0)は、イワナの建築の細部。
0が成功の戻り値であると判断されたら、失敗にはゼロ以外の値を使用するのが理にかなっています。これにより、多くの終了コードが、操作が失敗した理由の質問に答えることができます。
シェルで0はtrueですがfalseは1なのはなぜですか?
シェルの基本的な使用法の1つは、スクリプトを作成してプロセスを自動化することです。通常、これは操作を呼び出し、操作の終了ステータスに基づいて条件付きで何か他のことを行うことを意味します。フィリップA.はこの投稿に対する彼の回答でうまく説明しました
一般的にbashおよびUNIXシェルでは、戻り値はブール値ではありません。これらは整数の終了コードです。
次に、これらの操作の終了ステータスをブール値として解釈する必要があります。成功(0
)終了ステータスをtrueに、ゼロ以外/失敗の終了ステータスをfalse にマップすることは理にかなっています。これを行うと、チェーンシェルコマンドを条件付きで実行できます。
以下に例を示しmkdir deleteme && cd $_ && pwd
ます。シェルは0をtrueと解釈するため、このコマンドは期待どおりに機能します。シェルが0をfalseと解釈する場合は、各操作で解釈された終了ステータスを反転する必要があります。
要するに、アプリケーションが正常終了ステータスに対して0を返すという慣例を考えると、シェルが0をfalseとして解釈するのは無意味です。
[* 1]:はい、多くの場合、オペレーションは単なる成功メッセージ以上のものを返す必要がありますが、それはこのスレッドの範囲を超えています。
Advanced Bash-Scripting GuideのAppendix Eも参照してください