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. Ubuntu mysql安装,还有可视化界面

    安装mysql sudo apt-get install mysql-server sudo apt-get install mysql-client sudo apt-get install lib ...

  2. mongodb 更新数组出现can't append to array using string field name

    数据库内容大概如下: { _id:, "hero_list" : { " : { , , "equip" : [ [ ], [ ], [ ], { , ...

  3. python在一个列表中查找

    # -*- coding: utf-8 -*-__author__ = 'Administrator'import bisect#简化一些操作#1:在一个列表中查找""" ...

  4. 使用IDEA动态调试smali代码

    原创,转载请注明出处. 一般java ide(如eclipse.idea)都可用来进行smali的动态调试,这里选择IDEA. 第1步:使用apktool反编译apk java -jar apktoo ...

  5. myeclipse自动补全设置

    第一步: windows -->preference -->java -->editor -->content Assist --> auto activation -- ...

  6. 解决System.Data.SQLite兼容32位和64位问题

    将当前说明文档的目录下的x64.x86目录和System.Data.SQLite.dll文件复制到您的应用程序根目录中(注意更新引用,引用System.Data.SQLite.dll即可,两目录中的不 ...

  7. (转)简易WCF负载均衡方案

    最近跟高老师讨论nginx跟tomcat集群做负载均衡方案.感觉很有意思.想到自己项目中服务用的WCF技术,于是就想WCF如何做负载均衡,Google了一会,发现wcf4.0的路由服务好像可以实现.不 ...

  8. .net 判断日期格式yyyy-MM-dd hh:MM:ss的正则表达式

    加上引用: using System.Text.RegularExpressions; /// <summary> /// 检查字符串是否是日期格式        /// </sum ...

  9. silverlight visifire控件图表制作——silverlight 静态页面xaml

    一.silverlight 静态页面 1. 时间控件:DatePicker ,添加引用: xmlns:sdk="clr-namespace:System.Windows.Controls;a ...

  10. OpenCV——ANN神经网络

    ANN-- Artificial Neural Networks 人工神经网络 //定义人工神经网络 CvANN_MLP bp; // Set up BPNetwork's parameters Cv ...