对文件应用更改。
patch [ -b [ -B Prefix ] ] [ -f ] [ -l ] [ -N ] [ -R ] [ -s ] [ -v ] [ -c | -e | -n ] [ -d Directory ] [ -D Define ] [ -F Number ] [ -i PatchFile ] [ -o OutFile ] [ -p Number ] [ -r RejectFile ] [ -x Number ] [ File ]
patch 命令读取如何更改文件 的源文件指示信息,然后应用这些更改。源文件包含由 diff 命令产生的差别列表(或者 diff 列表)。差异列表是比较两个文件和构建关于如何纠正差别的指示信息的结果。缺省情况下,patch 命令使用从标准输入读入的源文件,但是使用 -i 标志和 PatchFile 变量可以覆盖此设置。
差异列表有三种格式:正常、上下文 或者是 ed 编辑器风格。patch 命令 确定差异列表格式,除非被 -c、-e 或 -n 标志否决。
缺省情况下,文件的打过补丁的版本替换原始版本。指定 -b 标志时, 每个补丁文件的原文件保存在同名的文件中,只是在文件名后附加了后缀 .orig。使用 -o 标志也可以指定输出的目的地。
-p 标志使得 无需手工编辑补丁文件就可以定制补丁文件到本地用户目录结构中。通过指定从路径全称除去多少部分可以做到这一点。例如,如果补丁文件包含 路径名称 /curds/whey/src/blurfl/blurfl.c,那么:
不指定 -p 标志使得 patch 命令使用基本名称。在上面的示例中, 此文件为 blurfl.c。
补丁文件必须包含单行或多行头信息,后跟单个或多个补丁。每个补丁必须包含一行或多行文件名标识,其格式由 diff -c 命令和单个或多个 diff 命令输出集产生,通常称为 hunks。
patch 命令跳过补丁文件中的任何前导文本,然后应用实际的差异列表,并且跳过任何后续文本。因而,可以将包含差异列表的文件或消息当成补丁文件使用,此时 patch 命令仍然有效。 在这种情况下,如果整个差异列表使用一致的数量缩进,patch 命令也会调整其间距。
要更改原始文件中的行范围,每一补丁中的块(hunk)必须为单独的差异列表。补丁内连续块(hunk)的行号必须以升序方式出现。
如果没有指定 File 参数, 要获得供编辑的文件名,patch 命令会执行下面的步骤:
如果补丁文件包含不止一个补丁,patch 命令尝试应用每个差异列表,就好像它 来自于单独的补丁文件。在这种情况下,为每个差异列表确定需要打补丁的文件名, 并且审查每个差异列表前的头文本以获得如文件名和修订版级别的信息。
如果指定 -c、 -e 或 -n 标志,patch 命令将每块(hunk)内的信息分别解释成上下文差别、ed 编辑器差别或者正常差别。否则,patch 命令确定基于块(hunk)内信息格式的差别类型。
patch 命令通过获取块(hunk)的首行序号和添加或减去由于应用前一块(hunk)而产生的任何行偏移来搜索位置以应用每一块(hunk)。 如果在这一行位置不可能有精确匹配,patch 命令前后搜索以获取与块(hunk)的内容精确匹配的行集合。
如果找不到这些位置,且如果 patch 命令正在应用上下文差异列表,patch 命令能进行非精确搜索。fuzz factor 指定了非精确匹配的行数目。如果 模糊因子设置成 1 或者更大,patch 命令执行第二次扫描,这一次忽略上下文的第一行和最后一行。如果没有匹配结果,且最大模糊因子设置成 2 或者更大, patch 命令执行第三次扫描,这一次会忽略上下文的前两行和最后两行。(缺省模糊因子最大值为 2)。 如果找不到匹配的位置,patch 命令在拒绝文件中放置 块(hunk)。创建拒绝文件时,其名称和输出文件一样,只是在文件名有后缀 .rej。使用 -r 标志可以覆盖此命名约定。
以上下文差异列表格式写拒绝块(hunk),而不管补丁文件的格式如何。如果输入是正常差别或 ed 编辑器样式差别,拒绝文件可能包含上下文格式零行差别。 拒绝文件中块(hunk)的行编号 可能与补丁文件中的行编号不同。这是因为 拒绝文件的行编号反映了新文件而不是老文件中故障块(hunk)的大约位置。
当完成每块(hunk)后,patch 命令会告诉您该块(hunk)是成功还是失败。也可以获知为每块(hunk)假定的新行编号。 如果这与差异列表中指定的行编号不同,就会报告偏移量。patch 命令也说明是否使用模糊因子来进行匹配。
注:单一的大偏移可能表示块(hunk)安装位置不正确。 模糊因子的使用可能表示布局不正确。
准备将补丁装载给其它用户的程序员应该考虑下面的附加原则:
#ifdef ... NEWCODE #else ... OLDCODE # endif
patch 命令不能为两个版本都打补丁。 如果 patch 命令成功,它可能 补丁了错误版本但是返回了一个成功的退出状态。
返回下面的出口值:
0 | 成功完成。 |
1 | 产生错误。 |
patch -i difflisting prog.c
patch -b -i difflisting prog.c
它将更改应用到 prog.c 并且 在 prog.c.orig 文件中保存 prog.c 的原始内容。
patch -i difflisting -o prog.new prog.c
它将 prog.c 当成源文件使用,但是更改后的版本写到名为 prog.new 的文件中。
/usr/bin/patch | 包含 patch 命令。 |