次のスクリプトを検討してください
#!/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
例のように設定されていると仮定)。