『學了就忘』Linux軟件包管理 — 48、給源碼包打補丁
- 2021 年 11 月 18 日
- 筆記
- 測試基礎必會技能 - Linux系統
在以前的軟件源碼包,需要打補丁的時候比較多。現在的源碼包很少進行打補丁了,因為根據需求安裝不同的版本即可,比較商業化了。(也就是知道如何給源碼包打補丁就可以了,了解即可。)
從開發者的角度,補丁就是軟件新版本和現有版本的不同。這個不同包括缺少的文件和修改的內容。
1、補丁的生成
# 比較old和new文件的不同
[root@localhost ~]# diff 選項 old new
選項:
-a:將任何文檔當做文本文檔處理。
-b:忽略空格造成的不同。
-B:忽略空白行造成的不同。
-I:忽略大小寫造成的不同。
-N:當比較兩個目錄時,如果某個文件只在一個目錄中,則在另一個目錄中視作空文件。
-r:當比較目錄時,遞歸比較子目錄。
-u:使用統一的輸出格式。
常用的選項為-N、-a、-u、-r
。
示例:
# 建立測試目錄
[root@localhost ~]# mkdir test
# 進入測試目錄
[root@localhost ~]# cd test
# 文件old txt,為了一會輸出便於比較,每行分開
[root@localhost test]# vi old.txt
our
school
# 文件new.txt
[root@localhost test]# vi new.txt
our
school
in
Beijing
比較下兩個文件的不同,並生成補丁文件txt.patch
,命令如下:
# 比較兩個文件的不同,同時生成txt.patch補丁文件
[root@localhost test]# diff -Naur /root/test/old.txt /root/test/new.txt > txt.patch
# 注意:
# -Naur是常用選項,是用的時候直接用。
# 兩個文件一定要使用絕對路徑。
# 最後的文件名不需要絕對路徑。
# 查看下這個文件
[root@localhost test]# vi txt.patch
# 前一個文件,減號代表少內容的文件
---/root/test/old.txt 2012-11-23 05:51:14.347954373 +0800
# 後一個文件,加號代表多內容的文件
+++/root/test/new.txt 2012-11-23 05:50:05.772988210 +0800
# 後一個文件比前一個文件多兩行(+表示)
@@ -2,3 + 2,5 @@
our
school
+in
+beijing
2、補丁的打入
# 按照補丁文件進行更新
[root@localhost test]# patch -pn <補丁文件
選項:
-pn:n為數字。代表按照補丁文件中的路徑,指定更新文件的位置。
可以看到上面打入補丁的命令中,沒有寫需要打補丁的是哪個文件。因為在補丁文件中都有記錄,新文件和舊文件的位置。
如下圖所示:
-pn
不好理解,我們說明下。
- 補丁文件是要打入舊文件的,但是你當前所在的目錄和補丁文件中的記錄的目錄是不一定匹配的,所以就需要
-pn
來同步兩個目錄的位置。(也就是說補丁文件中記錄的舊文件目錄,會追加到當前目錄上。p
幾就是消除補丁文件中舊文件目錄的幾級目錄。)- 比如我當前是在
/root/test
目錄中(我要打補丁的舊文件就在當前目錄下),補丁文件中記錄的文件目錄為/root/test/old.txt
,這時如果寫入-p1
(在補丁文件目錄中取消一級目錄)- 那麼補丁文件就會打入
/root/test/root/test/old.txt
文件中,這顯然是不對的。那如果寫入的是-p2
(在補丁文件目錄中取消二級目錄)那麼補丁文件打入的就是/root/test/test/o1d.txt
,這顯然也不對。如果寫入的是-p3
(在補丁文件目錄中取消三級目錄)那麼補丁文件就是打入的
/root/test/old.txt
,我們的old.txt
文件就在這個目錄下,所以就應該是-p3
。
那麼我們更新下old.txt
文件,命令如下:
# 給old.txt文件打補丁
[root@localhost test]# patch -p3 < txt.patch
patching file old.txt(patch文件已經打入到old.txt文件中)
# 查看下old.txt的內容吧。多出來了in Beiiing兩行
[root@localhost test]# cat old.txt
our
school
in
Beijing