
다음 스크립트를 고려하십시오.
#!/usr/bin/env bash
set -eux
set -o pipefail
function will_fail() {
echo 'I do not work because of xyz' >&2
exit 1
}
will_fail | gzip > test.gz
그러면 파일이 생성됩니다.test.gz
will_fail
파이프를 사용하여 중지 하고 생성하지 않는 방법이 있나요 test.gz
?
답변1
파이프라인이 시작되기 전에 출력 파일이 생성되므로 출력 파일이 생성되는 것을 방지할 방법이 없습니다.
따라서 유일한 기회는 파이프라인이 실패할 경우 파일을 다시 제거하는 것입니다.
스크립트 솔루션을 찾고 있다면 에서 지원되는 A kshism
( 트랩)을 사용할 수 있습니다.ERR
bash
이 경우에는 다음을 사용하는 것이 좋습니다.
set -o noclobber
파일이 이미 존재하는 경우 파일이 손상되는 것을 방지합니다.
따라서 권장 코드는 다음과 같습니다.
set -o noclobber
trap 'rm -rf test.gz' ERR
some_cmd | gzip > test.gz
답변2
if ! will_fail | gzip >test.gz; then
rm -f test.gz
fi
이는 파일 생성을 방지하지 않지만(리디렉션은 파이프라인이 실행되기 전에 파일을 생성함) 파이프라인이 실패하면 파일을 제거합니다( pipefail
예제에서 설정되었다고 가정).