linux patch patch命令详解

大家好,如果您还对linux patch不太了解,没有关系,今天就由本站为大家分享linux patch的知识,包括patch命令详解的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

linux patch命令

linux系统下patch命令是什么呢?下面是patch命令的具体介绍:

1、patch命令简介:

Patch的主要用途是给代码打补丁,修正已知的错误,或者作为一种调试手段来调试有问题的代码,发现问题和验证修正的结果。

2、patch命令功能:

修补文件。

3、语法:patch[-bceEflnNRstTuvZ][-B备份字首字符串][-d工作目录][-D标示符号][-F监别列数][-g控制数值][-i修补文件][-o输出文件][-p剥离层级][-r拒绝文件][-V备份方式][-Y备份字首字符串][-z备份字尾字符串][--backup-if-mismatch][--binary][--help][--nobackup-if-mismatch][--verbose][原始文件修补文件]或path[-p剥离层级][修补文件]

4、补充说明:patch指令让用户利用设置修补文件的方式,修改,更新原始文件。倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行。如果配合修补文件的方式则能一次修补大批文件,这也是Linux系统核心的升级方法之一。

5、参数:

-b或--backup备份每一个原始文件。

-B备份字首字符串或--prefix=备份字首字符串设置文件备份时,附加在文件名称前面的字首字符串,该字符串可以是路径名称。

-c或--context把修补数据解译成关联性的差异。

-d工作目录或--directory=工作目录设置工作目录。

-D标示符号或--ifdef=标示符号用指定的符号把改变的地方标示出来。

-e或--ed把修补数据解译成ed指令可用的叙述文件。

-E或--remove-empty-files若修补过后输出的文件其内容是一片空白,则移除该文件。

-f或--force此参数的效果和指定-t参数类似,但会假设修补数据的版本为新版本。

-F监别列数或--fuzz监别列数设置监别列数的最大值。

-g控制数值或--get=控制数值设置以RSC或SCCS控制修补作业。

-i修补文件或--input=修补文件读取指定的修补问家你。

-l或--ignore-whitespace忽略修补数据与输入数据的跳格,空格字符。

-n或--normal把修补数据解译成一般性的差异。

-N或--forward忽略修补的数据较原始文件的版本更旧,或该版本的修补数据已使用过。

-o输出文件或--output=输出文件设置输出文件的名称,修补过的文件会以该名称存放。

-p剥离层级或--strip=剥离层级设置欲剥离几层路径名称。

-f拒绝文件或--reject-file=拒绝文件设置保存拒绝修补相关信息的文件名称,预设的文件名称为.rej。

-R或--reverse假设修补数据是由新旧文件交换位置而产生。

-s或--quiet或--silent不显示指令执行过程,除非发生错误。

-t或--batch自动略过错误,不询问任何问题。

-T或--set-time此参数的效果和指定-Z参数类似,但以本地时间为主。

-u或--unified把修补数据解译成一致化的差异。

-v或--version显示版本信息。

-V备份方式或--version-control=备份方式用-b参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这个字符串不仅可用-z参数变更,当使用-V参数指定不同备份方式时,也会产生不同字尾的备份字符串。

-Y备份字首字符串或--basename-prefix=--备份字首字符串设置文件备份时,附加在文件基本名称开头的字首字符串。

-z备份字尾字符串或--suffix=备份字尾字符串此参数的效果和指定-B参数类似,差别在于修补作业使用的路径与文件名若为src/linux/fs/super.c,加上backup/字符串后,文件super.c会备份于/src/linux/fs/backup目录里。

-Z或--set-utc把修补过的文件更改,存取时间设为UTC。

--backup-if-mismatch在修补数据不完全吻合,且没有刻意指定要备份文件时,才备份文件。

--binary以二进制模式读写数据,而不通过标准输出设备。

--help在线帮助。

--nobackup-if-mismatch在修补数据不完全吻合,且没有刻意指定要备份文件时,不要备份文件。

--verbose详细显示指令的执行过程。

patch,是打补丁的命令,有很多用法,见帮助#man patch

patch-p0(“p”指的是路径,后面的数字表示去掉路径的第几部分。0,表示不去掉,为全路径)

patch-p1(“p”后面的数字1,表示去掉前第一个路径)fetch

fetch

fetch...

patch-p0...fetch

patch-p patch-tcp_auto_buf-20061212-RELENG_6.diff

也可以把文件中的目录全改成系统已在的目录如/usr/src/sys.....

6、Patch过程分三个大的步骤:

一是用diff工具比较新旧代码,生成patch文件;二是使用patch命令,将patch文件合并到原有代码;三是检查有无无法patch的文件,修改或重新选择是否对其做patch。patch打完了就可以直接编译了。

patch对应到的主要命令有两个,diff和patch。至于检查结果,在linux环境下使用ls命令或者find命令查看有无rej类型的文件就可以了。

现实中常见的做法,是在makefile中加入patch命令,在编译过程中做好代码的patch,然后编译代码。

7、diff命令常用选项:

以下面命令举例:

diff-uNr orginal_proj updated_proj test.patch

其中,-u表示使用unified output format,统一输出格式,比较紧凑而且易读;

-N用来处理新增的文件(此时参数对应的是目录)

-r表示递归处理所有的子目录。

整条命令的意思是,递归比较original和updated两个工程中的所有文件,使用统一的输出格式,添加新增的文件,生成结果输出到 test.patch文件中。

其他常用的选项还有:-p仅针对C程序有效,显示每个不同所对应的函数;-i忽略大小写,对于大小写不敏感的场合使用,比如某些html文件;–exclude表示排除某些文件或者目录,不做比较,适用于如代码包含cvs目录之类的场合。剩下的其他参数可以参考info或者help或者man。

patch文件的格式

上个例子中生成的文件是统一输出格式的,比较紧凑而且易读。举例:

— autoconf-2.7/acgeneral.m4 Wed Nov 22 11:42:00 1995##旧文件

+++ autoconf-2.9/acgeneral.m4 Sat Mar 16 15:53:07 1996##新文件

@@-1,7+1,7@@##第一段不同的地方,旧文件从1行开始,共7行;新文件从1行开始,共7行

dnl Parameterized macros.##无+—符号,是引用的内容

dnl Requires GNU m4.

dnl This file is part of Autoconf.

-dnl Copyright(C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.##删除的内容

+dnl Copyright(C) 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.##替换的内容

dnl

dnl This program is free software; you can redistribute it and/or modify

dnl it under the terms of the GNU General Public License as published by

@@-51,7+51,7@@##第二段不同之处

divert(-1)dnl Throw away output until AC_INIT is called.

changequote([, ])

-define(AC_ACVERSION, 2.7)

+define(AC_ACVERSION, 2.9)

dnl Some old m4′s don’t support m4exit. But they provide

dnl equivalent functionality by core dumping because of the

从刚才的diff命令的例子可以看到,一个patch文件中可能包含整个工程中所有不同文件的比较结果,因此,必须区分具体的文件路径和文件名,以及单一文件中多个不同之处的情况。统一输出格式中,使用—表示旧文件,使用+++表示新文件;文件中的多个不同的文本或代码段,使用@@开始,@@结束的一行来开始;中间的内容是新旧文件的起始行数和本段比较包含的函数,空格做分隔。每段中,无-+符号的是引用的行,有-号的是删除的行,有+号的是新增的行。这样就可以区分开这些情况了。

diff命令还可以生成非统一格式的patch文件,但可读性非常差,所以从编程的角度讲,一定是使用unified output format比较合理。

8、patch命令常用选项:

以下面命令举例:

patch-lNp0 test.patch

其中,-l的意思–ignore-whitespace,忽略空白字符;-N表示–forward,忽略已经打过或者已经取消的补丁(ignore patches that seem to be reversed or already applied);-pnum表示–strip=num,如果没有num参数,表示直接使用文件名,0表示全路径名,其他表示从左开始去除几个slash到,哪一级目录(cut slash count).

整条命令的意思是,使用test.patch文件作为输入,忽略空白符号和已经处理过的补丁,保留patch文件中的包含文件的全路径名,对patch文件涉及到的文件做补丁。

linux下的patch命令

patch命令用于为特定软件包打补丁,该命令使用diff命令对源文件进行操作。

格式:patch [选项] [原始文件 [补丁文件]]

常用参数:

-r是一个递归选项,设置了这个选项,diff会将两个不同版本源代码目录中的所有对应文件全部都进行一次比较,包括子目录文件。

-N选项确保补丁文件将正确地处理已经创建或删除文件的情况。

-u选项以统一格式创建补丁文件,这种格式比缺省格式更紧凑些。

-p0选项从当前目录查找目的文件(夹)(直接使用补丁文件里面指定的路径)

-p1选项忽略掉第一层目录,从当前目录查找(去掉补丁文件指定路径最左的第1个'/'及前面所有内容)。

-E选项说明如果发现了空文件,那么就删除它

-R选项说明在补丁文件中的“新”文件和“旧”文件现在要调换过来了(实际上就是给新版本打补丁,让它变成老版本)

示例:

1、单个文件

首先将两个文件的内容显示如下:

$ cat test0

00000000

00000000

00000000

$ cat test1

00000000

11111111

00000000

*生成补丁:

$ diff-uN test0 test1>test1.patch

这样将通过比较,生成test1的补丁文件。这里选项u表示使用同一格式输出这样产生的输出便于阅读易于修改,N表示把不存在的文件看做empty的.就算文件test0不存在,也会生成补丁。

*把test0通过打补丁变成test1文件:

$ patch-p0<test1.patch

或$patch<test1.patch

这样,test0的内容将和test1的内容一样,但是文件名称还是test0。关于patch的选项见后面多文件有说明。当前目录下可以有test1.如果比较的时候test0是不存在的,那么这时候会生成一个test0文件。

*把打过补丁的test0还原:

$ patch-RE-p0<test1.patch

或$patch-R<test1.patch

这样,test0的内容将还原为原来没有打过补丁的状态。当前目录下可以有test1.这里的-E选项是要求patch在文件为空的时候删除文件,这个选项是不必要的因为patch是根据时间戳来判断一个文件是否存在。如果比较的时候test0是不存在的,这将会删除test0文件。

**

2、多个文件的:

首先查看文件结构如下:

1)外层目录列表:

$ ls-p

prj0/ prj1/

2)子目录prj0列表:

$ ls-p prj0

prj0name test0

3)子目录prj1列表:

$ ls-p prj1

prj1name test1

4)文件prj0/prj0name:

$ cat prj0/prj0name

--------

prj0/prj0name

--------

5)文件prj1/prj1name:

$ cat prj1/prj1name

---------

prj1/prj1name

---------

6)文件prj0/test0:

$ cat prj0/test0

0000000

0000000

0000000

0000000

0000000

0000000

0000000

7)文件prj1/test1:

$ cat prj1/test1

1111111

1111111

1111111

1111111

1111111

1111111

1111111

*创建补丁:

$ diff-uNr prj0 prj1> prj1.patch

这里项u表示使用同一格式输出这样产生的输出便于阅读易于修改,N表示把不存在的文件看做empty的,r表示递归地比较子目录,比较的结果被标准重定向到文件prj1.patch中了。

运行之后,输出的就是一个补丁,描述了两个文件的不同,这个补丁就是把diff参数的第一个文件打补丁变成第二个文件的补丁文件。

实际过程依次比较两个目录下的同名文件,如果这里不加-N就会指明prj0name和test0只在prj0中存在,prj1name和test1只在prj1中存在,这就无法比较了,所以这里为了能够比较,加上了-N选项。

为了便于理解,这里给出prj1.patch文件的内容:

$ cat prj1.patch

diff-uNr prj0/prj0name prj1/prj0name

--- prj0/prj0name 2009-08-24 10:44:19.000000000+0800

+++ prj1/prj0name 1970-01-01 08:00:00.000000000+0800

@@-1,5+0,0@@

---------

-

-prj0/prj0name

-

---------

diff-uNr prj0/prj1name prj1/prj1name

--- prj0/prj1name 1970-01-01 08:00:00.000000000+0800

+++ prj1/prj1name 2009-08-24 10:45:05.000000000+0800

@@-0,0+1,5@@

+---------

+

+prj1/prj1name

+

+---------

diff-uNr prj0/test0 prj1/test0

--- prj0/test0 2009-08-24 11:21:12.000000000+0800

+++ prj1/test0 1970-01-01 08:00:00.000000000+0800

@@-1,7+0,0@@

-0000000

-0000000

-0000000

-0000000

-0000000

-0000000

-0000000

diff-uNr prj0/test1 prj1/test1

--- prj0/test1 1970-01-01 08:00:00.000000000+0800

+++ prj1/test1 2009-08-24 11:21:33.000000000+0800

@@-0,0+1,7@@

+1111111

+1111111

+1111111

+1111111

+1111111

+1111111

+1111111

*将prj0中的所有文件打补丁成为prj1中的所有文件:

步骤如下:

1)$ cp prj1.patch./prj0

2)$ cd prj0

3)$ patch-p1< prj1.patch

这里,把补丁文件复制到了prj0下面,然后将该文件夹下面的文件"变成"prj1下的文件了.

$ ls-p

prj1name prj1.patch test1

关于patch命令的-p选项接数字n,意思是去掉补丁文件里指定路径的前n个'/'前缀.

例如补丁文件中指定路径是/u/howard/src/blurfl/blurfl.c,那么p0选项处理之后的路径还是原来路径不变,而p1选项处理之后的路径是u/howard/src/blurfl/blurfl.c,同理p4处理之后的路径是:blurfl/blurfl.c.

注意:如果在外层目录运行这个命令,那么会在外层目录创建两个prj1name和test1文件。

*将打好补丁的prj0中的所有文件还原成为原来打补丁之前的文件:

$ patch-R-p1< prj1.patch

运行之后文件变成原来的文件了,如下:

$ ls-p

prj0name prj1.patch test0

*将prj1中的所有文件反向打补丁成为prj0中的所有文件:

$ patch-R-p1< prj1.patch

运行之后prj1中的文件变成prj0的文件了,如下:

$ ls-p

prj0name prj1.patch test0

*将prj1中反打补丁后的文件还原成原来的prj1中的文件:

$ patch-p1< prj1.patch

运行之后,prj1中的文件被还原了,如下:

$ ls-p

prj1name prj1.patch test1

*在外层目录把prj0的内容打补丁成prj1的内容:

$ls-p

prj0/ prj1.patch

$patch-p0<prj1.patch

这样prj0中的内容变成了prj1中的内容,但是prj0的目录名仍旧是prj0,如下:

$ls-p prj0

prj1name test1

注意:当前文件夹下面不能prj1目录,否则会出现一些警告提示。

*在外层目录把prj0的内容反打补丁还原成原来prj0的内容:

$ patch-R-p0<prj1.patch

这样原来的文件如下:

$ ls-p prj0

prj0name test0

**

Linux命令之patch

patch命令是Linux系统中用于应用补丁文件以修改或更新原始文件的工具。其基本语法包括多个参数选项,帮助用户实现精确的文件修改。patch命令通过接受原始文件和补丁文件作为输入,根据补丁文件中的差异信息,将修改应用到原始文件上。使用patch时,通过参数控制补丁应用的细节,如文件的备份、路径处理、差异解读方式等。

patch命令的主要参数包括:备份选项(-b,--backup),用于备份原始文件;前缀设置(-B,--prefix=)用于指定备份文件名的前缀字符串;差异解读选项(-c,--context)用于解析补丁文件中的差异信息;目录设置(-d,--directory=)用于指定工作目录;ifdef标记(-D,--ifdef=)用于标识补丁应用中的特定条件;ed指令输出(-e,--ed)用于生成ed格式的指令;删除空文件(-E,--remove-empty-files)用于删除应用补丁后的空文件;强制选项(-f,--force)用于假设补丁文件为新版本;模糊匹配(-F,--fuzz)用于处理差异文件中的模糊匹配;获取控制选项(-g,--get=)用于处理RSC或SCCS控制的修补作业;输入补丁文件(-i,--input=)用于指定输入补丁文件路径;忽略空格(-l,--ignore-whitespace)用于忽略空格和跳格字符;正常差异解读(-n,--normal)用于以标准方式解读差异;向前应用(-N,--forward)用于处理旧版本补丁;输出文件设置(-o,--output=)用于指定输出文件名;路径条数剥离(-p,--strip=)用于剥离路径条数;拒绝文件设置(-r,--reject-file=)用于指定保存拒绝修补信息的文件;反向应用(-R,--reverse)用于处理补丁文件为新旧文件位置互换情况;安静模式(-s,--quiet,--silent)用于避免显示进程执行信息;批量模式(-t,--batch)用于自动忽略错误;设置时间(-T,--set-time)用于将补丁文件的存取时间设为本地时间;统一差异解读(-u,--unified)用于以统一格式解读差异;版本信息显示(-v,--version)用于显示版本信息;版本控制(-V,--version-control=)用于设置备份文件的后缀字符串;基于基本名称的备份前缀(-Y,--basename-prefix=)用于设置备份文件的基本名称前缀;后缀设置(-z,--suffix=)用于设置备份文件的后缀字符串;UTC时间设置(-Z,--set-utc)用于将补丁文件的时间设为UTC格式;不备份错误文件(--nobackup-if-mismatch)用于在补丁不匹配时避免备份文件;详细输出(--verbose)用于显示执行过程的详细信息。

例如,使用patch命令时,可以指定路径选项(如-p0或-p1)来调整查找补丁文件和原始文件的路径层级。-E参数用于在应用补丁后删除空文件,-R参数则用于将补丁文件中的“新”文件和“旧”文件位置互换。补丁文件通常由diff工具生成,包含了源文件和目标文件的差异信息。

在实际应用中,patch命令常用于系统升级、软件源代码更新或系统维护等场景。通过灵活使用其参数,用户可以精确控制补丁应用的各个方面,确保文件修改的准确性和效率。

阅读剩余
THE END