파이프라인의 일부로 패치를 어떻게 적용합니까? 즉, 표준 입력을 패치하는 방법은 무엇입니까?

파이프라인의 일부로 패치를 어떻게 적용합니까? 즉, 표준 입력을 패치하는 방법은 무엇입니까?

mypatch.diffstdin에 균일한 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)

GNU 2.6 이상이 필요합니다( -o -참조 :-r -patch범죄그리고범죄).

관련 정보