コマンドが失敗した場合、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

出力ファイルはパイプラインが開始される前に作成されるため、出力ファイルの作成を防ぐ方法はありません。

したがって、パイプラインが失敗した場合に唯一のチャンスは、ファイルを再度削除することです。

スクリプト ソリューションを探している場合は、でサポートされている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例のように が設定されていると仮定)。

関連情報