Unix コマンドがシェルでゼロ以外の値で終了し、bash if 条件で使用された場合に True と評価されるのはなぜですか?

Unix コマンドがシェルでゼロ以外の値で終了し、bash if 条件で使用された場合に True と評価されるのはなぜですか?

コマンドはpatch -R -p0 -s -f --dry-run < abc.patch終了コード 1 で失敗し、パッチ コマンドのエラー メッセージを出力しますが、if 条件で否定で使用すると、パススルー (パスの印刷など) を行う場合、次のコードは次のようになります。

if ! patch -R -p0 -s -f --dry-run < abc.patch; then
         echo "Pass"
fi

私は何を試みたか。 dev / null文字列をリダイレクトしましたが、結果は変更されませんでした。

ここで何が間違っているかを理解するのに役立ちます。

ベストアンサー1

patchforステートメントの終了ステータスを否定したため、ifそのステートメントは「失敗した場合は文字列を出力します」ifと読み取ることができます。patchPass

このifステートメントは、指定されたコマンドが成功したかどうかをテストします(本物)または失敗(間違った)。必要に応じてこれを覚えて、この答えの残りの部分を忘れてください。

コマンドが失敗した場合、終了ステータスはゼロではないため、失敗の原因を詳しく調べることができます。ユーティリティが返された実際の値の意味を指定する場合(たとえば、マニュアルの最後のセクションを参照curlrsync、スクリプトはエラーを適切に処理するように選択できます。

コマンドの終了ステータスが 0 の場合、ユーティリティは正常に完了したことをシェルに通知します。

終了状態は、「ブール」または「真または偽」ではなく「エラーコード」に近い。 true / falseブールテストは、ifユーティリティにエラー状態があるかどうかを確認するために終了ステータスをテストするステートメントによって内部的に実行されます。そうでない場合(終了ステータスが0)、テストは次のようになります。本物つまり、ユーティリティは失敗しませんでした。

おすすめ記事