patch 命令输出“补丁意外地在行中间结束”

patch 命令输出“补丁意外地在行中间结束”

我正在尝试编写 diff 和 patch 命令的脚本。如果bzcat使用的话,会遇到这样的警告

# bzcat consolidated.patch.tar.bz2 | patch -d dev -p1 
  patch unexpectedly ends in middle of line
  patch unexpectedly ends in middle of line
# echo $?
  0

如果用解压后的文件打补丁就不会出现这样的警告

# tar -xf consolidated.patch.tar.bz2
# patch -d dev -p1 < consolidated.patch
# echo $?
  0

我确实比较了结果文件夹,但两种方法都是相同的

# diff -aurN dev1 dev2 > res.diff
# stat res.diff 
  File: res.diff
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file

答案1

根据文件名以及它以 开头的事实tar,您的文件consolidated.patch.tar.bz2是一个使用 bzip2 压缩的 tar 存档。它不像 zip 存档那样,用一个工具即可将文件粘贴在一起并进行压缩,但聚合文件 ( tar) 和压缩批次 ( bzip2) 的两个步骤是不同的。 (除了智能实现tar知道常见的压缩工具并可以自动执行它们。)

因此,您得到的bzcat不是存档的文件,而是未压缩的 tar 存档。即使它只包含一个文件。难怪patch读不了。

使用 GNU tar(至少),您可以使用-O/--to-stdout选项将文件数据发送到 stdout:

tar -xj -f consolidated.patch.tar.bz2 -O | patch

(或者,... -O consolidated.patch仅输出该文件,以防它不是唯一的文件。)

如果只有一个文件,则实际上不需要该tar步骤,并且可以在不使用 的情况下压缩文件tar,只需使用bzip2 consolidated.patch, 创建consolidated.patch.bz2,然后bzcat就可以继续工作了。

相关内容