mypatch.diff
stdinに均一なdiffを適用し、結果をstdoutとして出力したいと思います。
これまで私は次のことを試しました。
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シェルの解決策は次のとおりです。
#!/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
POSIXの一部ではありませんmktemp
。バラよりPOSIXにmktempコマンドがないのはなぜですか?より多くの情報とシェルスクリプトで一時ファイルを作成するには?POSIXシェル用のソリューションです。