리디렉션을 사용할 때 빈 파일을 만들지 마세요.

리디렉션을 사용할 때 빈 파일을 만들지 마세요.

foo | bar > out.txt출력은 일반적으로 out.txt.

그러나 foo실패하면 당연히 bar출력이 없으므로 생성됩니다 out.txt. 그러나 일반적인 결과는 foo실패할 때 out.txt빈 출력이 생성된다는 것입니다.

나는 종종 Makefiles에서 이러한 유형의 명령을 사용하는데, 여기서 문제는 더 복잡해집니다. 일단 빈 파일이 생성되면 makemake가 빈 파일을 보고 다시 생성할 필요가 없다고 결정하기 때문에 명령이 작동을 멈춥니다.

out.txt파이프라인이 기준을 충족하지 못하는 경우 생성되지 않도록 하는 방법이 있나요?

답변1

Makefile의 경우 항상 임시 파일로 생성한 후 이름을 바꾸십시오.

out.txt: in.txt
       set -o pipefail ; foo $< | bar > [email protected]
       mv [email protected] $@

(물론 공백 대신 탭을 사용하십시오).

이는 빌드 프로세스 중에 바로가기로 확장될 수 있습니다.

out.txt: in.txt
       set -o pipefail ; foo $< | bar > [email protected]
       cmp -s [email protected] $@ || mv -f [email protected] $@

결과 out.txt 파일이 변경되지 않은 경우 수정 시간은 업데이트되지 않습니다. 이는 변경되지 않은 out.txt에 의존하는 항목을 다시 빌드할 필요가 없음을 의미합니다.

답변2

이것이 도움이 됩니까?

foo_output="$(foo)"
test -n "${foo_output-}" && bar_output="$(bar <<< $foo_output)"
test -n "${bar_output-} && echo "$bar_output" > output

관련 정보