Salida automática del script bash shell en caso de error

He estado escribiendo un script de shell y me parece útil si hubiera la posibilidad de detener la ejecución de dicho script de shell si alguno de los comandos fallara. Vea abajo para un ejemplo:

#!/bin/bash cd some_dir ./configure --some-flags make make install 

Entonces, en este caso, si el script no puede cambiar al directorio indicado, entonces no querrá hacer una ./configura luego si falla.

Ahora soy consciente de que podría tener una verificación if para cada comando (que creo que es una solución sin esperanza), pero ¿existe una configuración global para hacer que el script salga si uno de los comandos falla?

Use el set -e incorporado:

 #!/bin/bash set -e # Any subsequent(*) commands which fail will cause the shell script to exit immediately 

Alternativamente, puede pasar -e en la línea de comando:

 bash -e my_script.sh 

También puede desactivar este comportamiento con set +e .

(*) Nota:

El shell no sale si el comando que falla forma parte de la lista de comandos inmediatamente después o hasta que la palabra clave, parte de la prueba sigue las palabras reservadas if o elif , parte de cualquier comando ejecutado en un && o || lista excepto el comando que sigue a la final && o || , cualquier comando en una tubería pero el último, o si el valor de retorno del comando se está invirtiendo con !

(del man bash )

Para salir de la secuencia de comandos tan pronto como falla uno de los comandos, agregue esto al principio:

 set -e 

Esto hace que la secuencia de comandos salga inmediatamente cuando algún comando que no es parte de alguna prueba (como en una condición if [ ... ] o una construcción && ) sale con un código de salida distinto de cero.

Aquí está cómo hacerlo:

 #!/bin/sh abort() { echo >&2 ' *************** *** ABORTED *** *************** ' echo "An error occurred. Exiting..." >&2 exit 1 } trap 'abort' 0 set -e # Add your script below.... # If an error occurs, the abort() function will be called. #---------------------------------------------------------- # ===> Your script goes here # Done! trap : 0 echo >&2 ' ************ *** DONE *** ************ ' 

Úselo junto con pipefail .

 set -e set -o pipefail 

-e (errexit): Anula el script en el primer error, cuando un comando sale con un estado distinto de cero (excepto en ciclos while o while, if-tests, list constructos)

-o pipefail: hace que una tubería devuelva el estado de salida del último comando en la tubería que devolvió un valor de retorno distinto de cero.

Capítulo 33. Opciones

Una alternativa a la respuesta aceptada que cabe en la primera línea:

 #!/bin/bash -e cd some_dir ./configure --some-flags make make install 

Una expresión es:

 cd some_dir && ./configure --some-flags && make && make install 

Me doy cuenta de que puede ser largo, pero para las secuencias de comandos más grandes puede dividirlo en funciones lógicas.

Creo que lo que estás buscando es el comando trap :

 trap command signal [signal ...] 

Para más información, mira esta página .

Otra opción es usar el comando set -e en la parte superior del script: hará que el script salga si algún progtwig / comando devuelve un valor no verdadero.