Diff出力「バイナリファイル 違います。」しかし、一般的な詳細出力ではありません。

Diff出力「バイナリファイル 違います。」しかし、一般的な詳細出力ではありません。

「orienv」と「currenv」コマンドを使用して2つのファイルを比較したいと思いますdiff

これら2つのファイルを作成する方法は次のとおりです。

  1. "currenv"ファイルの生成

    $cat /proc/1/environ >> currenv
    $cat /pcoc/279/environ >> currenv
    $cat /proc/295/environ >> currenv
    //295 is the pid of the current console
    
  2. orienvファイルの生成

    $printenv > orienv
    

diff次に、次のように呼び出します。

diff -u orienv currenv

次のような結果が得られた。

バイナリ orienv と currenv が異なります。

diffフラグ付きの正常な出力を期待します-u(例:違いを示す出力)。ハンサムな男、他のファイルにはない情報を持つファイルを表します。

何が間違っていますか?

ベストアンサー1

環境変数の値には改行文字を含めることができます。内の変数は、環境変数の値や名前には現れないnullバイトで区切られています。 (これは偶然ではありません。環境がメモリに表現される方法です。)diffがNULLバイトを検出すると、ファイルがバイナリであると判断し(定義によると、テキストファイルにNULLバイトが含まれていない)、表示を放棄します。違いは、ほとんどのバイナリ形式ではdiff印刷が役に立たないためです。/proc/PID/environ

diffにファイルをテキストとして処理するよう指示し続けることができますがdiff --text、2つのファイル間でこれを行うと、実際には多くの改行文字が含まれていないため、大幅に変更された1〜2行しか表示されません。 Diffは改行で区切られた行でのみ機能します。の内容と出力の間でこれを行うと、改行が区切り文字として使用されるため、すべてが変更されたことを意味します。/proc/PID/environ/proc/PID/environprintenvprintenv

有用な出力を得るためには、ヌルバイトを改行に変換します。これにより、各環境変数が行の先頭から始まります。

diff -u orienv --label=currenv <(tr '\0' '\n' <currenv)

便利で明確な出力のために、改行文字もヌルバイトに変換され、各環境変数が独自の単一行に表示されます。次に、diff 出力にヌルバイトがある場合は、元のファイルの対応する場所に改行文字が含まれていることを示します。

diff -u --text --label=currenv <(tr '\0\n' '\n\0' <currenv1) --label=currenv <(tr '\0\n' '\n\0' <currenv2)

おすすめ記事