コマンドが失敗すると、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例のように設定されていると仮定)。

関連情報