bash detiene la tubería si el comando falla

bash detiene la tubería si el comando falla

Considere seguir el guión

#!/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

Esto creará un archivotest.gz

¿Hay alguna manera con las tuberías de detenerse will_faily no crear test.gz?

Respuesta1

Dado que el archivo de salida se crea antes de que se inicie la canalización, no hay forma de evitar que se cree el archivo de salida.

Entonces, la única posibilidad que tiene es eliminar el archivo nuevamente en caso de que falle la canalización.

Se puede usar una kshism(la ERRtrampa) que sea compatible bashsi está buscando una solución de script.

En este caso, recomiendo encarecidamente utilizar

set -o noclobber

Para evitar que el archivo sea bloqueado en caso de que ya exista.

Entonces el código recomendado quedaría así:

set -o noclobber

trap 'rm -rf test.gz' ERR

some_cmd | gzip > test.gz

Respuesta2

if ! will_fail | gzip >test.gz; then
        rm -f test.gz
fi

Esto no impide la creación del archivo (la redirección creará el archivo antes de que se ejecute la canalización), pero elimina el archivo si la canalización falla (suponiendo que pipefailesté configurado, como en el ejemplo).

información relacionada