![파이프라인의 일부로 패치를 어떻게 적용합니까? 즉, 표준 입력을 패치하는 방법은 무엇입니까?](https://linux55.com/image/217527/%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8%EC%9D%98%20%EC%9D%BC%EB%B6%80%EB%A1%9C%20%ED%8C%A8%EC%B9%98%EB%A5%BC%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%A0%81%EC%9A%A9%ED%95%A9%EB%8B%88%EA%B9%8C%3F%20%EC%A6%89%2C%20%ED%91%9C%EC%A4%80%20%EC%9E%85%EB%A0%A5%EC%9D%84%20%ED%8C%A8%EC%B9%98%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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)