
次のスクリプトを検討してください
#!/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
(トラップ) を使用できます。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
例のように が設定されていると仮定)。