
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_fail
y 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 ERR
trampa) que sea compatible bash
si 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 pipefail
esté configurado, como en el ejemplo).