patch指令让用户利用补丁文件来修改,更新原始文件,达到升级原始文件功能的目的。linux内核的升级方式也是采用这种。
1、生成补丁文件:
我们通过diff命令来生成补丁文件,diff -Naur a.txt b.txt
首先我们来看两个文件:a.txt,b.txt
$ vim -O a.txt b.txt
sadfasdfas |sadfasdfas
1212 |0000
|1212
hello hadoop |
openresty is very good |hello java
~ |openresty is very very good
通过执行diff -Naur命令生成补丁文件:
$ diff -Naur a.txt b.txt
--- a.txt 2020-07-28 22:12:11.547358887 +0800
+++ b.txt 2020-07-28 21:34:30.379661137 +0800
@@ -1,5 +1,6 @@
sadfasdfas
+0000
1212
-hello hadoop
-openresty is very good
+hello java
+openresty is very very good
可以通过重定向命令,将diff的输出保存到文件,作为补丁文件。diff -Naur a.txt b.txt > 1.diff
2、打补丁:
1)自动打补丁:
有了补丁文件文件,我们可以通过patch命令来升级原始文件。
$ patch < 1.diff
patching file a.txt
这样,a.txt文件就打好了补丁。如果想撤销补丁则执行:diff -R < 1.diff
$ patch -R < 1.diff
patching file a.txt
注:使用diff命令生成补丁文件时,参数后的第一个文件名(a.txt)是原始文件,生成的补丁文件(1.diff)也是针对原始文件做的diff,所以执行patch < 1.diff 时,就会自动将1.diff打进a.txt中。注意顺序不能高反了。
2)手动打补丁:
上面是正常情况下的自动打补丁。但还有一种情况,假设:b.txt 在 a.txt基础上做了一些修改,然后生成了1.diff补丁文件,与此同时,某个人也在a.txt上同样的某行上做了一些修改。这时,使用补丁文件对a.txt进行升级就有可能会失败,假设失败就需要手动打补丁。
失败原始:我们看补丁文件中,某行的修改上下都会有一些托衬内容,如果源文件对托衬内容也做了修改,而且修改的完全无法识别,这时补丁文件就无法识别,所以只能手工打了。
示例1:
还是上例,我们生成1.diff后,对a.txt首行字母s变成a,然后执行打补丁:
$ patch < 1.diff
patching file a.txt
Hunk #1 succeeded at 1 with fuzz 1.
$ ll
total 16
-rw-r--r-- 1 root root 213 Jul 28 22:15 1.diff
-rw-r--r-- 1 root root 61 Jul 28 22:17 a.txt
-rw-r--r-- 1 root root 53 Jul 28 22:17 a.txt.orig
-rw-r--r-- 1 root root 61 Jul 28 21:34 b.txt
我们看虽然打成功了,但是多了一个a.txt.orig原始文件。而且会给出一个提示。
示例2:
还是上例回到最初状态,生成1.diff后,对a.txt首行、后两行做一个“恶魔”修改,执行打补丁命令:
$ patch < 1.diff
patching file a.txt
Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED -- saving rejects to file a.txt.rej
$ ll
total 20
-rw-r--r-- 1 root root 213 Jul 28 22:15 1.diff
-rw-r--r-- 1 root root 62 Jul 28 22:18 a.txt
-rw-r--r-- 1 root root 62 Jul 28 22:18 a.txt.orig
-rw-r--r-- 1 root root 213 Jul 28 22:18 a.txt.rej
-rw-r--r-- 1 root root 61 Jul 28 21:34 b.txt
提示失败,生成了orig、rej两个文件。这是就需要手动打补丁了。