剛把LFS重頭到尾過了一遍,一下子過夠了configure->make->make install這三部曲的癮了...
在編譯軟件包或者是內核的時候,經常需要根據特定的需求對源代碼文件打補丁,補丁可以在專門的網站上下載,比如www.kernel.org,也可以自己製作(前提是技術水平要夠格)。得到xxx.patch文件後,就需要使用patch命令將其補上,所以應該要會使用patch命令的基本用法;如果要自己生成patch文件,就需要使用diff命令。
diff == - (類似於減號,做差)用來比較兩個文件,輸出它們間的不同之處
patch == + (類似於加號,做和)將包含兩文件差異部分的文件附加到原始文件上,產生新文件
舉例說明:
- root@hdp0:patch# nl A
- 1 00000
- 2 00000
- 3 00000
- root@hdp0:patch# nl B
- 1 11111
- 2 00000
- 3 00000
A和B兩個原始文件,A是舊文件,B是新文件
- root@hdp0:patch#diff -rNu A B > C
- root@hdp0:patch# nl C
- 1 --- A 2011-07-27 21:35:32.977011747 +0800 //-號表示舊文件,其後是A的詳細信息
- 2 +++ B 2011-07-27 21:35:43.644398050 +0800 //+號表示新文件,其後是A的詳細信息
- 3 @@ -1,3 +1,3 @@ //@@之間表示差異塊,-1,3表示A的內容是3行,有刪除,+1,3表示B的內容是3行,要增加
- 4 -00000 //00000這行刪除
- 5 +11111 //增加11111這行
- 6 00000
- 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。
- root@hdp0:patch# patch -Np0 -i C
- patching file A
- root@hdp0:patch# nl A
- 1 11111
- 2 00000
- 3 00000
從上面的結果中可以看見A已經變成B了。系統會自動根據C中的信息,選擇更新的目標,在patch命令中並不需要指定使用補丁的目標文件。
其中patch的選項的意義是:
-Np0 N表示注意空文件和是否已經打過補丁,而p0表示搜索補丁的目標文件時直接使用C中包含的A文件路徑。p1則表示從C中包含的A文件路徑的次級目錄搜索。這個和使用diff命令時的狀態有關係。
-i 後接補丁文件,如果沒有-i,則需要使用 < 符
如果打完補丁後覺得不合適,還可以撤銷補丁,也就是將B再變回A
- root@hdp0:patch# patch -RE -p0 -i C //RE參數決定了回溯效果
- patching file A
- root@hdp0:patch# nl A
- 1 00000
- 2 00000
- 3 00000
內容又變爲原始的A文件了。