foo | bar > out.txt
출력은 일반적으로 out.txt
.
그러나 foo
실패하면 당연히 bar
출력이 없으므로 생성됩니다 out.txt
. 그러나 일반적인 결과는 foo
실패할 때 out.txt
빈 출력이 생성된다는 것입니다.
나는 종종 Makefiles에서 이러한 유형의 명령을 사용하는데, 여기서 문제는 더 복잡해집니다. 일단 빈 파일이 생성되면 make
make가 빈 파일을 보고 다시 생성할 필요가 없다고 결정하기 때문에 명령이 작동을 멈춥니다.
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