
다음 스크립트를 고려해보세요
#!/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
예제와 같이 설정되었다고 가정).