bash - paso - scripts linux ejercicios resueltos
Salida automática del script de shell bash en caso de error (7)
He estado escribiendo un script de shell y me resultaría útil si hubiera la capacidad de detener la ejecución de dicho script de shell si fallara alguno de los comandos Vea a continuación un ejemplo:
#!/bin/bash
cd some_dir
./configure --some-flags
make
make install
Entonces, en este caso, si la secuencia de comandos no puede cambiar al directorio indicado, entonces no querrá hacer una ./configure después si falla.
Ahora soy consciente de que podría tener una comprobación if para cada comando (lo que creo que es una solución sin esperanza), pero ¿hay una configuración global para hacer que el script salga si falla uno de los comandos?
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 ***
************
''
Creo que lo que estás buscando es el comando trap
:
trap command signal [signal ...]
Para más información, vea esta página .
Otra opción es usar el comando set -e
en la parte superior de su secuencia de comandos: hará que la secuencia de comandos salga si algún programa / comando devuelve un valor no verdadero.
Para salir de la secuencia de comandos tan pronto como uno de los comandos haya fallado, agregue esto al principio:
set -e
Esto hace que la secuencia de comandos salga inmediatamente cuando un comando que no forma parte de alguna prueba (como en una condición if [ ... ]
o una construcción &&
) sale con un código de salida distinto de cero.
Un idioma es:
cd some_dir && ./configure --some-flags && make && make install
Me doy cuenta de que puede alargarse, pero para scripts más grandes, podría dividirse en funciones lógicas.
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
Use el set -e
builtin:
#!/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 deshabilitar este comportamiento con set +e
.
(*) Nota:
El shell no se cierra si el comando que falla es parte de la lista de comandos inmediatamente después de un tiempo o hasta que la palabra clave, parte de la prueba que sigue a if o elif palabras reservadas, parte de cualquier comando ejecutado en un && o || lista excepto el comando que sigue al final && o || , cualquier comando en una canalización, pero el último, o si el valor de retorno del comando se invierte con !
(de man bash
)
pipefail
junto con pipefail
.
set -e
set -o pipefail
-e (errexit): abortar la secuencia de comandos en el primer error, cuando un comando sale con un estado distinto de cero (excepto en hasta o mientras bucles, if-tests, list constructs)
-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.