patch(英文名称:patch) 命令是 Unix / Linux / FreeBSD 系统中应用补丁文件(patch file)的工具,它的功能是根据补丁文件中记录的 “差异”,使用这些差异信息对原始文件进行修改,更新原始文件到最新版本,它的主要优势在于能够实现增量更新(无需替换整个文件的内容)。patch 命令需要与 diff 命令(用于生成 补丁文件)配合使用。

本文将为你从多个方面介绍 patch 命令的使用方法,使你对 patch 命令具有基本的了解,好使用 patch 命令应用差异文件。

patch 命令语法结构

如下给出 patch 命令的基本语法结构形式:

patch [选项] [原始文件] < 补丁文件

# 或(从标准输入读取补丁)
patch [选项] [原始文件]

语法结构中各部分的解释说明:

  • [选项]:用于控制补丁文件如何进行应用的参数。
  • [原始文件]:若补丁文件中包含了原始文件名,则可以省略原始文件。
  • 补丁文件:包含文件差异信息的文件(通常是由 diff 命令生成的),使用重定向符号 < 把补丁文件转入到原始文件

剥离层级解释说明

剥离层级是指目录结构中的几层目录

之所以要剥离目录层级是因为:可能存在开发的开发时的目录层级与用户真正使用时的目录层级不同, 例如对于文件 /home/myuser/project/old/src/main.c

  • 开发者在目录下/home/myuser/project对文件进行打补丁,则补丁中记录的文件路径为 old/src/main.c
  • 而用户在 /home/myuser/project/ 目录下应用补丁,实际原文件路径为 src/main.c

所以在应用补丁时需要删除一层目录,这时的剥离层级为 1。

patch 命令使用示例

1. 把补丁应用到文件

提供原始文件,和对应的补丁文件,即可实现应用补丁,实现增量修改:

patch config.conf < bugfix.patch

如上示例中:将漏洞修改补丁应用到配置文件。

2. 剥离多余的目录层级

使用 -p 选项去除多余目录层级,使能够正确的应用到文件:

patch -p1 -d /app/src < upgrade.patch

3. 撤销补丁变更

使用 -R 选项反转应用补丁,即撤销补丁,使用 -i 指定补丁文件:

patch -R -i feature.patch

patch 命令选项详解

如下给出 patch 命令选项的详细解释说明:

选项 说明 参数示例
-i FILE 用于指定需要输入的补丁文件 -i update.patch
-o FILE 用于指定输出文件 -o patched_file.c
-pNUM NUM为剥离路径的层级(当为0时,表示不剥离路径,即保留完整路径) -p1 剥离一级目录
-R 反向应用补丁文件,即撤销补丁,恢复源文件 patch -R < patchfile
-b 应用补丁时,创建备份文件,备份文件的默认后缀名为.orig 自动生成备份
--backup[=METHOD] 备份时,提供备份选项,用来控制备份的行为:
simple(默认) numbered(带编号) existing(保持与现有的形式相同)
--backup=numbered
-V METHOD 备份使用的命名方式:
simple(默认) numbered(带编号) existing(保持与现有的形式相同)
-V numbered
-B PREFIX 用于指定备份文件名称中使用的前缀名 -B .backup/
-Y PREFIX 用于指定补丁文件名称中使用的前缀名 -Y .patches/
-d DIR 用于指定当前工作的目录 -d src/
-E 删除没有实际内容的空输出文件 自动清理没有内容的空文件
-t 静默输出模式(遇到错误时,忽略错误,不显示错误信息) 非交互式执行的方式
-f 强制应用补丁文件,而不会验证是否可以正常应用补丁 使用该选项需要谨慎
-F NUM 设置模糊匹配的阈值(行数) -F 3 允许3行偏移
-l 忽略补丁数据与输入数据中的空格不同 忽略空格造成的内容差异
-c 将补丁的格式设置为上下文格式的文件形式 兼容传统的格式
-e 将补丁的格式设置为 ed 脚本格式的文件形式 特殊格式处理形式
-n 将补丁的格式设置为普通格式的文件形式 基础的 diff 格式
-u 将补丁的格式设置为统一格式的文件形式(该选项为默认值) 现代标准格式
-N 应用补丁时,跳过已经应用的补丁 为了防止补丁的重复应用
--dry-run 测试补丁是否能够正确应用,而不实际应用补丁,修改原文件 可用于安全测试
--verbose 应用补丁时,输出详细信息
--help 显示帮助信息
--version 显示版本信息

补丁文件结构

如果想要了解补丁文件的结构,请查看 diff 命令,在 diff 命令中有关于补丁文件格式详细解释说明。

结语

patch 功能是应用使用 diff 命令生成的补丁文件。在本文中我们全面的介绍了 patch 的语法结构及其功能,并给出了 patch 命令的具体使用示例,相信你能够依据本教程基本掌握并使用 patch 命令。

patch 命令可以在 Linux 各发行版和 FreeBSD 系统中使用,基本功能是相同的。