web-dev-qa-db-ja.com

diffコマンドが失敗した理由を確認するにはどうすればよいですか?

エラーコード2で完了したdiff --brief -r /home/mateusz/ /media/mateusz/Database/backup_test_tmp_folder/home/mateusz/コマンドを実行していました。ドキュメントによると、「入力が同じ場合は終了ステータスは0、異なる場合は1、問題が発生した場合は2です。」

残念ながら、コマンドは失敗した理由を示す手掛かりを与えずに終了しました。私はstracesを使用しようとしましたが、残念ながら、生成されたログに基づいて診断することはできません(3.5GBのstraceファイルの最後の150行が https://Gist.github.com/matkoniecz/15ed855bd3f161ad6354c7d637234804 -にまた、78 KBのstraceログを生成した後に失敗したSudoで実行されているdiffについても同様です。

私はdiffコマンドを修正して、死んで2を返す前に何らかの説明を出力することを検討しましたが、私のプログラムがそのようなデバッグのサポートの唯一の欠如である可能性は低いため、より良い解決策があることを示唆しているようです(うまくいけば「解釈方法を学ぶstrace」)。

それでは、なぜdiffコマンドが失敗したのかをどうやって確認するのでしょうか? straceまたはdiffコマンドにprintfデバッグを追加するよりも優れたツールはありますか?

3

出力を読むことができます。 diffは、以下以外の異なる終了ステータスコードを提供しません。

  • 入力が同じ場合は0、
  • 異なる場合は1、
  • トラブルの場合は2。

(from man diff

「トラブル」とは、ファイルを読み取ることができなかった、または他のほとんど何もできないことを意味します。

Diff(GNU diffutils)3.3を使用してフォルダーを比較する少しのテストから、diffはメッセージをstdoutまたはstderrに出力します。

  • 1つのファイルが欠落している場合、終了ステータスは1であり、これはstdoutに表示されます。

    Only in folder1: file-a
    
  • 1つのファイルが読み取れない場合、終了ステータスは2であり、これはstderrに表示されます。

    diff: folder1/file-b: Permission denied
    

(両方のエラーが発生した場合、終了ステータスは2です。)

したがって、stdoutとstderrを読み取り/解析して、問題が何であるかを調べてください。

Diffは、「トラブル」に遭遇した後、さらにファイルを処理し続けるため、終了ステータス2の理由を報告する行は、出力のどの部分にもあることに注意してください。


これを参照してください GNU "diffutils manual" link ディレクトリの比較の詳細について(および一般的なdiffの使用については、単にman diffよりもinsanelyより詳細です)。次のような情報:

... --report-identical-files-s)オプションを使用すると、同一のファイルのペアが報告されます

ファイルが1つしかない場合、diffは通常その内容を表示しません。 1つのファイルが存在するが、他のファイルは存在しないと報告するだけです。 diffを欠落しているファイルが空であるかのように動作させると、実際に存在するファイルの内容全体が出力されます... --new-file-N)を使用します...古いディレクトリに新しいファイル以外の大きなファイルが含まれる場合ディレクトリでは、--unidirectional-new-fileの代わりに-Nオプションを使用して、パッチを小さくすることができます。

ディレクトリの比較中に一部のファイルを無視するには、--exclude=pattern-x pattern)オプションを使用します

2つのディレクトリを比較して途中で停止した場合、後で中断したところから続行することができます。これを行うには、--starting-file=file-S file)オプションを使用します。これは、ファイルファイルと最上位ディレクトリレベルのアルファベット順で後のファイルのみを比較します。

または、他のサイトからのこれらの関連Q:

1
Xen2050