Salida automática del script de shell Bash en caso de error [duplicado]
He estado escribiendo algunos scripts de shell y me resultaría útil si existiera la posibilidad de detener la ejecución de dicho script de shell si alguno de los comandos fallara. Vea a continuación 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 ciertamente no querrá realizar un ./configure después si falla.
Ahora soy muy consciente de que podría tener una verificación if para cada comando (lo cual creo que es una solución inútil), pero ¿existe una configuración global para hacer que el script salga si uno de los comandos falla?
Utilice el set -e
incorporado:
#!/bin/bash
set -e
# Any subsequent(*) commands which fail will cause the shell script to exit immediately
Alternativamente, puedes pasar -e
la línea de comando:
bash -e my_script.sh
También puedes desactivar este comportamiento con set +e
.
Es posible que también desee emplear todas o algunas de las opciones -e
-u
-x
y -o pipefail
de esta manera:
set -euxo pipefail
-e
sale en caso de error, -u
errores en variables no definidas, -x
imprime comandos antes de la ejecución y -o (for option) pipefail
sale en caso de fallas en la canalización de comandos. Algunas trampas y soluciones están bien documentadas aquí .
(*) Nota:
El shell no sale si el comando que falla es parte de la lista de comandos inmediatamente después de una palabra clave while o hasta , parte de la prueba que sigue a las palabras reservadas if o elif , parte de cualquier comando ejecutado en && o || lista excepto el comando que sigue al && final o || , cualquier comando en una canalización excepto el último, o si el valor de retorno del comando se invierte con !
(de man bash
)
Para salir del script tan pronto como uno de los comandos falle, agregue esto al principio:
set -e
Esto hace que el script se cierre inmediatamente cuando algún comando que no forma parte de alguna prueba (como una if [ ... ]
condición o una &&
construcción) sale con un código de salida distinto de cero.