patch命令和diff命令是linux打补丁的成对命令,diff 负责生产xxxxx.patch文件,patch命令负责将补丁打到要修改的源码上。但是patch命令的参数-p很容易使人迷惑,因为对-p 后面的数字理解不清晰,造成patch打不上,项目时间拖延,很是郁闷。后来仔细实践了一下,弄清楚了-p实际的含义。
        举例说明更加容易看懂。比如有一个patch文件,名为drvAUDIO_if.patch,在/home/brinus/testdir/目录下。需要打补丁的源文件路径为/home/brinus/testdir/develop/.../drvAUDIO_if.h,develop为源码根目录,drvAUDIO_if.h为需要打patch的源码。那么patch命令的-p值取什么并不取决于源码根目录develop之前有多少级目录,而取决于从源码根目录develop到需要打patch的drvAUDIO_if.h的目录级数和patch文件中的路径级数的差值。也就是说,源码放在什么地方都无所谓,有所谓的是差值。
patch文件内容:

  diff -U 10 -Naur output/619977/previousVersion///develop/include/Kangaroo/k3/drvAUDIO_if.h                                output/619977/currentVersion///develop/include/Kangaroo/k3/drvAUDIO_if.h                                                    --- output/619977/previousVersion///develop/include/Kangaroo/k3/drvAUDIO_if.h       2013-08-30 19:09:00.970605620 +0800

+++ output/619977/currentVersion///develop/include/Kangaroo/k3/drvAUDIO_if.h        2013-08-30 19:09:01.394607088 +0800

@@ -2817,44 +2817,48 @@

...... 略 ......
patch文件首有需要打patch的源码的的路径: output/619977/previousVersion///develop/include/Kangaroo/k3/drvAUDIO_if.h 源码根目录从develop到需要打patch文件的路径: develop/include/Kangaroo/k3/drvAUDIO_if.h 如果当前目录在/home/brinus/testdir/,即与源码根目录在同级目录下,patch命令应该为:
    #cd  /home/brinus/testdir/ #patch -p3 < /home/brinus/testdir/drvAUDIO_if.patch
解释:testdir目录下有develop源码根目录,3的含义是去除patch文件首的指示路径“output/619977/previousVersion///develop/include/Kangaroo/k3/drvAUDIO_if.h”中的“output/619977/previousVersion/”,剩下的部分“develop/include/Kangaroo/k3/drvAUDIO_if.h” 与源码的路径完全一致,这样patch文件就可以根据具体行号及增(+)删(-)符号对源文件进行打patch。(注:“output/619977/previousVersion///”与“output/619977/previousVersion/”一样) 即: output/619977/previousVersion///develop/include/Kangaroo/k3/drvAUDIO_if.h                                
develop/include/Kangaroo/k3/drvAUDIO_if.h
如果当前目录在/home/brinus/testdir/develop,patch命令应该为:
#cd  /home/brinus/testdir/develop/
#patch -p4 < /home/brinus/testdir/drvAUDIO_if.patch
 
即去除当前目录develop在patch文件首的指示路径中的develop之前的路径个数
所以,-p后的数值与2个路径有关:1. 当前所在路径;2. patch文件首的打patch的源文件指示路径。
与patch文件所在路径无关。 找到当前路径下的源码根目录,再与patch文件首打patch的源码目录进行比对,该目录名之前的目录个数就是-p后面的数值
打patch成功会显示: patching file include/Kangaroo/k3/drvAUDIO_if.h Hunk #1 succeeded at 2156 (offset 12 lines). 打patch失败会显示: patching file develop/include/Kangaroo/k3/drvAUDIO_if.h Hunk #1 FAILED at 2144. 1 out of 1 hunk FAILED -- saving rejects to file develop/include/Kangaroo/k3/drvAUDIO_if.h.rej 如果当前目录是develop的话,那么这个路径是在当前目录下新建路径develop/include/Kangaroo/k3/drvAUDIO_if.h.rej,两个develop不是同一个目录。

linux中patch命令 -p 选项的更多相关文章

  1. linux中ls命令使用选项

    ls:英文全名:List即列表的意思 -a 列出目录下的所有文件,包括以 . 开头的隐含文件.-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出.-c 输出文件的 i 节 ...

  2. Linux中监控命令top命令使用方法详解

    收集了两篇关于介绍Linux中监控命令top命令的详细使用方法的文章.总的来说,top命令主要用来查看Linux系统的各个进程和系统资源占用情况,在监控Linux系统性能方面top显得非常有用,下面就 ...

  3. 13 Basic Cat Command Examples in Linux(转) Linux中cat命令的13中基本用法

    Cat (串联) 命令是Linux/Unix开源系统中比较常用的一个命令.我们可以通过Cat命令创建一个或多个文件,查看文件内容,串联文件并将内容输出到终端设备或新的文件当中,这篇文章我们将会以实例的 ...

  4. 12个 Linux 中 grep 命令的超级用法实例

    12个 Linux 中 grep 命令的超级用法实例 你是否遇到过需要在文件中查找一个特定的字符串或者样式,但是不知道从哪儿开始?那么,就请grep来帮你吧. grep是每个Linux发行版都预装的一 ...

  5. linux中grep命令的使用

    转载:http://blog.csdn.net/universsky/article/details/8866402 linux中grep命令的使用 grep (global search regul ...

  6. linux中top命令的用法

    收集了两篇关于介绍Linux中监控命令top命令的详细使用方法的文章.总的来说,top命令主要用来查看Linux系统的各个进程和系统资源占用情况,在监控Linux系统性能方面top显得非常有用,下面就 ...

  7. Linux中grep命令的12个实践例子

    grep是每个Linux发行版都预装的一个强有力的文件模式搜索工具.无论何种原因,如果你的系统没有预装它的话,你可以很容易的通过系统的包管理器来安装它(Debian/Ubuntu系中的apt-get和 ...

  8. Linux培训教程 linux中nl命令使用介绍

    nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...

  9. Linux中exec命令相关

    Linux中exec命令相关 exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. b ...

随机推荐

  1. 浅谈C++中指针和引用的区别者之间的区别和用法(转)

    指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个 ...

  2. Hadoop 1、在虚拟机上进行 HDFS 安装

    一.准备条件 1.四台Linux虚拟机(1台NameNode节点,1台Secondary节点(Secondary和其中1台DataNode共用),外加2台DataNode) 2.下载Hadoop版本, ...

  3. Windows系统结构

    四种用户模式进程:1.系统支持进程,比如登录进程和会话管理器,并不是Windows服务,不有服务控制管理器启动2.服务进程,一些以Windows服务方式来运行的组件3.用户应用进程4.环境子系统服务器 ...

  4. LinearLayout 和 RelativeLayout

    共有属性: java代码中通过btn1关联次控件 android:id="@+id/btn1" 控件宽度 android:layout_width="80px" ...

  5. oracle 格式化数字 to_char

    转:http://blog.csdn.net/chinarenzhou/article/details/5748965 Postgres 格式化函数提供一套有效的工具用于把各种数据类型(日期/时间,i ...

  6. python-线程、进程、协程

    进程 && 线程 进程:是内存中的一个独立的句柄,我们可以理解为一个应用程序在内存中就是一个进程. 各个进程之间是内存相互独立,不可共享的 线程:每个应用运行之后就会对应启动一个主线程 ...

  7. .NET基础拾遗(3)字符串、集合和流3

    三.流和序列化 3.1 流概念及.NET中常见流 无论什么信息,文字,声音,图像,只要进入了计算机就都被转化为数字,以数字方式运算.存储.由于计算机中使用二进制运算,因此数字只有两个:0 与 1,就是 ...

  8. 使用kindeditor 注意

    ValidateRequest="false"引用编辑器要在最上端加入上面的话

  9. 《第一行代码》学习笔记16-碎片Fragment(1)

    1.碎片( Fragment):一种可以嵌入在活动当中的UI片段,能让程序更加合理和充分地利用大屏幕的空间,在平板上的应用广泛. 2.碎片同样包括布局,有自己的生命周期,甚至可理解成一个迷你型的活动. ...

  10. javascript实现倒计时程序

    最近在网上看到一道这样的面试题: 题:  网页中实现一个计算当年还剩多少时间的倒数计时程序,要求网页上实时动态显示“××年还剩××天××时××分××秒”? 我实现了,发现挺有意思,下面把我的代码贴出来 ...