¿Cómo detener un script de shell si alguno de los comandos falla?

Tengo un script de shell que ejecuta varios comandos. Lo que quiero es que si alguno de los comandos falla, el script detenga su ejecución. Para ello quiero comprobar si el código devuelto por alguno de los comandos es diferente a 0. Pero no se cómo hacerlo.

Estás leyendo una traducción autorizada de la pregunta Exit Shell Script Based on Process Exit Code planteada por Mark Roddy en StackOverflow.

Respuestas

#1

Lo más sencillo es que añadas las dos siguientes líneas al principio del todo de tu script:

set -e
set -o pipefail

La primera línea hace exactamente lo que quieres: detiene el script si alguno de los comandos falla y devuelve un código de estado diferente a 0.

La segunda línea es necesaria porque seguramente en tu script encadenarás comandos mediante pipes. Cuando encadenas comandos, sólo se tiene en cuenta el estado devuelto por el último comando de la cadena. Así que si falla cualquiera de los otros comandos, el script no se detendría. Lo que hace la segunda línea mostrada anteriormente es evitar este comportamiento.

Si prefieres comprobar a mano la salida de cada comando y personalizar el comportamiento en caso de error, puedes utilizar el siguiente código para comprobar el resultado de cada comando:

ls -al archivo.txt
codigo=$?
if [[ $codigo != 0 ]] ; then
    exit $codigo
fi

La primera línea es el comando a ejecutar (en este caso, un simple ls -al). La variable especial $? almacena el código devuelto por el último comando ejecutado. Así que sólo tienes que guardar ese valor en una variable y compararla con 0. Si es distinto, se ha producido un error en el comando (en este caso, por ejemplo que archivo.txt no exista).