Salida automática del script de shell Bash en caso de error [duplicado]

Resuelto radman asked hace 14 años • 8 respuestas

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?

radman avatar May 20 '10 11:05 radman
Aceptado

Utilice el set -eincorporado:

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

Alternativamente, puedes pasar -ela 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 -xy -o pipefailde esta manera:

set -euxo pipefail

-esale en caso de error, -uerrores en variables no definidas, -ximprime comandos antes de la ejecución y -o (for option) pipefailsale 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)

Adam Rosenfield avatar May 20 '2010 04:05 Adam Rosenfield

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.

sth avatar May 20 '2010 04:05 sth