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 셸용 솔루션입니다.
답변2
GNU에는 이 옵션이 없는 것 같습니다 patch
. stdin for 또는 stdout for (for는 폐기 거부로 해석됨)를 -
의미 하지만 패치할 파일은 현재 디렉터리에서 호출된 파일 로 해석됩니다 .-i
-o
-r
-
-
또한, 패치할 파일 이름에 따라 patch
관련 파일이나 접미사를 생성해야 합니다 ..orig
.rej
심볼릭 링크 패치를 허용하지 않는 것 같으 patch
므로 Linux에서는 /dev/stdin 또는 /proc/self/fd/0을 사용하는 것이 작동하지 않습니다.
사용하는 경우 임시 파일을 사용하는 프로세스 대체 양식을 zsh
사용할 수 있습니다 .=(...)
patch -i mypatch.diff -r - -o - =(cat)