web-dev-qa-db-ja.com

diffのエラー終了値は何ですか?

diffマンページで、これらの終了値を見つけました。

    0     No differences were found. 
    1     Differences were found.
   >1     An error occurred.

異なるエラーに対して1を超える異なる終了値がありますか?

54
sid_com

diffコマンドに依存します。私(GNU diffutils 3.0)のコメント:

終了ステータス0は違いが見つからなかったことを意味し、1は違いが見つかったことを意味し、2は問題を意味します。通常、異なるバイナリファイルはトラブルとしてカウントされますが、-aまたは--textオプション、または-qまたは--briefオプションを使用して変更できます。

57

使用するdiffのバージョンに応じて、エラーコードが異なる場合もあれば、そうでない場合もあります。正しく覚えていれば、標準のBSD diffは常に0、1、または2の終了コードを返しました。

ただし、マンページはdiffが実行する可能性のあるすべてをマッピングしているのではなく、diffコマンドの使用に使用できるドキュメントを示しています。シェルスクリプトでは、ファイルが一致した(exit = 0)か、一致しなかった(exit = 1)かを知りたいです。ただし、シェルスクリプトでは、diffコマンド自体が機能しなかったことも知りたいと思います。

diff $file1 file2 > /dev/null 2>&1
error=$?
if [ $error -eq 0 ]
then
   echo "$file1 and $file2 are the same file"
Elif [ $error -eq 1 ]
then
   echo "$file1 and $file2 differ"
else
   echo "There was something wrong with the diff command"
fi

2がdiffコマンドが失敗したことを意味していると言われたとしたら、新しいバージョンのdiffコマンドは、読み込めないファイル(exit = 2)と見つからないファイル(exit = 3)を区別したと想像してください。さて、以前のバージョンのdiffコマンドで次のことを行ったが、$file2は存在しませんでした:

diff $file1 file2 > /dev/null 2>&1
error=$?
if [ $error -eq 2 ]
then
   echo "There was something wrong with the diff command"
Elif [ $error -eq 1 ]
then
   echo "$file1 and $file2 differ"
else
   echo "$file1 and $file2 are the same file"
fi

上記のコードでは、2と1のエラーコードをチェックしましたが、3はチェックしていません。したがって、欠落ファイルを検出する代わりに、ファイルが一致すると仮定します。

このマンページは、今後のOSのアップグレードによってシェルスクリプトの大部分が突然失敗しないようにしようとしています。別個のawkおよびnawkコマンドと、別個のgrepおよびegrepコマンドが存在した理由です。

* @ chusによるコメントに従って更新。

7
David W.

私の場合、diffは127を返し、それを検索して、tldp.orgの「特別な意味を持つ終了コード」で見つけました。

127 "command not found" illegal_command $ PATHまたはタイプミスで問題が発生した可能性があります。

Diffに間違ったパスを使用しました。 :)

フォント:tldp.org/LDP/abs/html/exitcodes.html

3
Rossano Fenner