在以前的软件源码包,需要打补丁的时候比较多。现在的源码包很少进行打补丁了,因为根据需求安装不同的版本即可,比较商业化了。
从开发者的角度,补丁就是软件新版本和现有版本的不同。这个不同包括缺少的文件和修改的内容。
常用的选项为-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可以看到上面打入补丁的命令中,没有写需要打补丁的是哪个文件。因为在补丁文件中都有记录,新文件和旧文件的位置。如下图:
-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