
Рассмотрите следующий сценарий
#!/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
установлено, как в примере).