在一些地方对于‘-p数字’的作用,解释为剥离层级的意思,但是剥离层级又是什么意思?
这里引用《鸟哥的linux私房菜》中的例子就可以理解了。
因为 patch 的基本语法如下:
patch -p数字 < patch_file
patch_file是指补丁文件,该文件的内容中第一行是对新旧文件作一个diff命令。
diff -Naur old_file new_file
特别留意patch命令中那个“ -p数字”,那是与 patch_file 里面列出的文件名有关的信息。假如在 patch_file 第一行写的是这样:(【注意】这里是patch_file文件里写的内容,不是patch_file本身,而这个例子是假设old_file为
* /home/guest/example/expatch.old)
*/home/guest/example/expatch.old
那么当我下达“ patch -p0 < patch_file ”时,则更新的文件是“ /home/guest/example/expatch.old ”,如果“ patch -p1 < patch_file”,则更新的文件为“home/guest/example/expatch.old”,如果“patch -p4 < patch_file”则更新“expatch.old”,也就是说, -pxx 那个 xx 代表“拿掉几个斜线(/)”的意思!
剥离层级就是拿掉old_file中的前几个斜线的意思,那么问题又来了,为什么要拿掉斜线,我根据什么拿掉斜线,拿掉几根斜线。
参考其他大佬的博文我整理了一下:
假设补丁文件为/home/main-0.1/main_0.1_to_0.2.patch,我要更新的文件(即目标文件)为/home/main_0.1/old_file.c,在补丁文件中第一行写的是:
diff -Naur main-0.1/old_file.c main-0.2/new_file.c
目前的工作目录为/home/main-0.1
这里要仔细区分黑体文字对应的路径。
我的目的是用补丁文件去更新目标文件,这里用的patch命令,根据patch命令的语法,暂时可以这样写命令
patch -pxx < ../main_0.1_to_0.2
xx代表数字,这里还不知道怎么写,但是这里出现了一个疑问,我们的目的是用补丁文件去更新目标文件,但是命令中根本没有写目标文件,只有补丁文件所以这里答案就出来了,-pxx就是为了确定目标文件,我们已经知道目标文件是/home/main_0.1/old_file.c,但是我们不能直接写上去,我们要利用-pxx让系统自行确定目标文件。
如何利用-pxx确定目标文件呢,xx与三个路径有关:
- 工作目录/home/main-0.1
- 补丁文件中第一行所写旧文件路径main-0.1/old_file.c
- 目标文件/home/main_0.1/old_file.c
确定xx的方法如下:
- 首先我们让工作目录和补丁文件中所写旧文件路径相加,即为/home/main-0.1/main-0.1/old_file.c。
- 将相加的路径与目标文件的路径对比,可以发现多了一个main-0.1,我们要把这个main-0.1去掉。
- -pxx我们之前说过作用就是去掉补丁文件中所写的旧文件路径的斜线的,或者说是剥离层级,去掉路径中的前几层的。这里我们要去掉main-0.1/old_file.c中的main-0.1这一层,所以xx写1即可。
这样工作目录和经过处理后的补丁文件所写旧文件路径相加就是工作目录了。xx可以确定为1。大功告成。
参考:【Linux】关于patch命令中参数P的说明_can’t find file to patch at input line 28 perhaps _Mr_EvanChen的博客-CSDN博客
《鸟哥的linux私房菜-基础学习篇》第4版