Cat
Diff 輸出“二進製文件 <file1> <file2> 不同”,但不是通常的詳細輸出
我想使用命令比較兩個文件 - “orienv”和“currenv”
diff
。我創建這兩個文件的方式如下:
- 創建“currenv”文件
$cat /proc/1/environ >> currenv $cat /pcoc/279/environ >> currenv $cat /proc/295/environ >> currenv //295 is the pid of the current console
- 創建 orienv 文件
$printenv > orienv
然後我打電話
diff
如下diff -u orienv currenv
並得到以下輸出
二進製文件 orienv 和 currenv 不同
我期待一個
diff
帶有標誌的正常輸出-u
(例如,它顯示了hunks差異的輸出,指示哪個文件具有另一個文件沒有的資訊。什麼地方出了錯?
/proc/*/environ 不是文本文件。使用字元串:
strings /proc/{1,279,295}/environ >> currenv env > 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 <(tr '\0' '\n' <currenv)
為了獲得有用且明確的輸出,還將換行符轉換為空字節,以便每個環境變數都在自己的單行上。然後,如果 diff 輸出中有一個空字節,則表明原始文件在此位置包含換行符。
diff -u --text --label=currenv <(tr '\0\n' '\n\0' <currenv1) --label=currenv <(tr '\0\n' '\n\0' <currenv2)