Diff和Patch命令

 剛把LFS重頭到尾過了一遍,一下子過夠了configure->make->make install這三部曲的癮了...

在編譯軟件包或者是內核的時候,經常需要根據特定的需求對源代碼文件打補丁,補丁可以在專門的網站上下載,比如www.kernel.org,也可以自己製作(前提是技術水平要夠格)。得到xxx.patch文件後,就需要使用patch命令將其補上,所以應該要會使用patch命令的基本用法;如果要自己生成patch文件,就需要使用diff命令。


diff  ==  -  (類似於減號,做差)用來比較兩個文件,輸出它們間的不同之處
patch ==  +  (類似於加號,做和)將包含兩文件差異部分的文件附加到原始文件上,產生新文件
 
舉例說明:
  1. root@hdp0:patch# nl A 
  2.      1  00000 
  3.      2  00000 
  4.      3  00000 
  5. root@hdp0:patch# nl B 
  6.      1  11111 
  7.      2  00000 
  8.      3  00000 
A和B兩個原始文件,A是舊文件,B是新文件
 
  1. root@hdp0:patch#diff -rNu A B > C 
  2. root@hdp0:patch# nl C 
  3.      1  --- A   2011-07-27 21:35:32.977011747 +0800 //-號表示舊文件,其後是A的詳細信息
  4.      2  +++ B   2011-07-27 21:35:43.644398050 +0800 //+號表示新文件,其後是A的詳細信息
  5.      3  @@ -1,3 +1,3 @@ //@@之間表示差異塊,-1,3表示A的內容是3行,有刪除,+1,3表示B的內容是3行,要增加
  6.      4  -00000 //00000這行刪除
  7.      5  +11111 //增加11111這行
  8.      6   00000 
  9.      7   00000 
可以看到使用diff命令後生成的C文件內容,C文件就可以算一個使A變爲B的patch文件。
其中diff的3個參數的意義是:
  -r 對目標文件或者目錄遞歸對比
  -N 在對比時,僅出現一次的文件在對應的文件那裏表示爲空文件
  -u 使用詳細的對比信息顯示
PS:這裏要注意,diff命令中的A,B是區分新舊的,產生的C文件只是針對舊文件A的,意思是patch命令只能用C把A變成B,而不能使B變成A。
 
  1. root@hdp0:patch# patch -Np0 -i C 
  2. patching file A 
  3. root@hdp0:patch# nl A 
  4.      1  11111 
  5.      2  00000 
  6.      3  00000 
從上面的結果中可以看見A已經變成B了。系統會自動根據C中的信息,選擇更新的目標,在patch命令中並不需要指定使用補丁的目標文件。
其中patch的選項的意義是:
  -Np0 N表示注意空文件和是否已經打過補丁,而p0表示搜索補丁的目標文件時直接使用C中包含的A文件路徑。p1則表示從C中包含的A文件路徑的次級目錄搜索。這個和使用diff命令時的狀態有關係。
  -i 後接補丁文件,如果沒有-i,則需要使用 < 符
 
如果打完補丁後覺得不合適,還可以撤銷補丁,也就是將B再變回A
  1. root@hdp0:patch# patch -RE -p0 -i C //RE參數決定了回溯效果
  2. patching file A 
  3. root@hdp0:patch# nl A 
  4.      1  00000 
  5.      2  00000 
  6.      3  00000 
內容又變爲原始的A文件了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章