명령이 실패하면 bash는 파이프라인을 중지합니다.

명령이 실패하면 bash는 파이프라인을 중지합니다.

다음 스크립트를 고려해보세요

#!/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(트랩)를 사용할 수 있습니다.ERRbash

이 경우에는 다음을 사용하는 것이 좋습니다.

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예제와 같이 설정되었다고 가정).

관련 정보