Cat

Diff 輸出“二進製文件 <file1> <file2> 不同”,但不是通常的詳細輸出

  • December 17, 2019

我想使用命令比較兩個文件 - “orienv”和“currenv” diff

我創建這兩個文件的方式如下:

  1. 創建“currenv”文件
$cat /proc/1/environ &gt;&gt; currenv
$cat /pcoc/279/environ &gt;&gt; currenv
$cat /proc/295/environ &gt;&gt; currenv
//295 is the pid of the current console
  1. 創建 orienv 文件
$printenv &gt; orienv

然後我打電話diff如下

diff -u orienv currenv

並得到以下輸出

二進製文件 orienv 和 currenv 不同

我期待一個diff帶有標誌的正常輸出-u(例如,它顯示了hunks差異的輸出,指示哪個文件具有另一個文件沒有的資訊。

什麼地方出了錯?

/proc/*/environ 不是文本文件。使用字元串:

strings /proc/{1,279,295}/environ &gt;&gt; currenv
env &gt; orienv
diff -u orienv currenv

環境變數的值可以包含換行符。在中,變數由空字節分隔,空字節不能出現在環境變數的值或名稱中。(這並非巧合的是,環境在記憶體中的表示方式。)當 diff 看到空字節時,它決定文件是二進製文件(根據定義這是真的:文本文件不包含空字節)並放棄顯示差異,因為對於大多數二進制格式,列印出來的差異是沒有用的。/proc/*PID*/environ

您可以使用 告訴 diff 繼續並將文件視為文本diff --text,但如果您在兩個文件之間執行此操作,則可能會顯示僅包含一兩條大更改的行,因為實際上環境不會包含許多換行符。Diff 僅適用於用換行符分隔的行。如果您在 的內容和輸出之間執行此操作,則表示一切都已更改,因為使用換行符作為分隔符。/proc/*PID*/environ``/proc/*PID*/environ``printenv``printenv

要獲得有用的輸出,請將空字節轉換為換行符。這樣,每個環境變數都將從行首開始。

diff -u orienv --label=currenv &lt;(tr '\0' '\n' &lt;currenv)

為了獲得有用且明確的輸出,還將換行符轉換為空字節,以便每個環境變數都在自己的單行上。然後,如果 diff 輸出中有一個空字節,則表明原始文件在此位置包含換行符。

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

引用自:https://unix.stackexchange.com/questions/469483