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( Ловушка 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установлено, как в примере).

Связанный контент