我想mypatch.diff
对标准输入应用统一差异并将结果输出到标准输出。
到目前为止,我已经尝试过:
patch -i mypatch.diff -o - -u originalfile
成功应用mypatch.diff
并将结果打印到标准输出。但是,我仍然必须提供原始文件originalfile
,而不是通过标准输入。
如果我尝试这样的事情:
patch -i mypatch.diff -o - -u -
然后补丁被拒绝:
patching file -
Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED -- saving rejects to file -.rej
答案1
以下是 POSIX shell 的解决方案:
#!/bin/sh
patchstdin() (
set -o errexit
tmpdir="$(mktemp -d)"
trap 'rm -rf -- "$tmpdir"' EXIT
trap 'exit 1' HUP INT TERM
cat >"$tmpdir/original"
patch "$@" -o "$tmpdir/patched" "$tmpdir/original"
cat "$tmpdir/patched"
)
假设yourcommand
生成应该修补的输出,并且anothercommand
期望收到修补的输出,您可以调用:
yourcommand | patchstdin -i patch.diff | anothercommand
注意mktemp
不是 POSIX 的一部分。看为什么 POSIX 中没有 mktemp 命令?欲了解更多信息和如何在shell脚本中创建临时文件?用于 POSIX shell 的解决方案。
答案2
GNU 似乎没有patch
这个选项。-
表示 stdin for-i
或 stdout for -o
(for-r
被解释为丢弃拒绝),但要修补的文件-
被解释为-
在当前目录中调用的文件。
此外,patch
还需要根据要修补的文件名创建相关的具有.orig
或后缀的文件。.rej
它看起来patch
不允许你修补符号链接,因此在 Linux 上,使用 /dev/stdin 或 /proc/self/fd/0 不起作用。
如果使用zsh
,您可以使用=(...)
使用临时文件的进程替换形式:
patch -i mypatch.diff -r - -o - =(cat)