GNU/Linux >> Tutoriales Linux >  >> Linux

Cancelación de un script de shell si algún comando devuelve un valor distinto de cero

Agregue esto al comienzo del script:

set -e

Esto hará que el shell se cierre inmediatamente si un comando simple sale con un valor de salida distinto de cero. Un comando simple es cualquier comando que no forma parte de un if, while o before test, ni forma parte de un &&o || lista.

Consulte la página man de bash(1) sobre el comando interno "set" para obtener más detalles.

Personalmente, comienzo casi todos los scripts de shell con "set -e". Es realmente molesto tener un guión que continúa obstinadamente cuando algo falla en el medio y rompe las suposiciones para el resto del guión.


Si tiene que hacer una limpieza al salir, también puede usar 'trampa' con la pseudo-señal ERR. Esto funciona de la misma manera que atrapar INT o cualquier otra señal; bash arroja ERR si algún comando sale con un valor distinto de cero:

# Create the trap with   
#    trap COMMAND SIGNAME [SIGNAME2 SIGNAME3...]
trap "rm -f /tmp/$MYTMPFILE; exit 1" ERR INT TERM
command1
command2
command3
# Partially turn off the trap.
trap - ERR
# Now a control-C will still cause cleanup, but
# a nonzero exit code won't:
ps aux | grep blahblahblah

O, especialmente si está usando "set -e", podría interceptar EXIT; su trampa se ejecutará cuando el script salga por cualquier motivo, incluido un final normal, interrupciones, una salida causada por la opción -e, etc.


Las declaraciones if en su ejemplo son innecesarias. Solo hazlo así:

dosomething1 || exit 1

Si sigues el consejo de Ville Laurikari y usas set -e entonces, para algunos comandos, es posible que necesite usar esto:

dosomething || true

El || true hará que la canalización de comandos tenga un true devuelve el valor incluso si el comando falla, por lo que el -e La opción no eliminará el script.


Para agregar a la respuesta aceptada:

Tenga en cuenta que set -e a veces no es suficiente, especialmente si tienes tuberías.

Por ejemplo, suponga que tiene este script

#!/bin/bash
set -e 
./configure  > configure.log
make

... que funciona como se esperaba:un error en configure cancela la ejecución.

Mañana haces un cambio aparentemente trivial:

#!/bin/bash
set -e 
./configure  | tee configure.log
make

... y ahora no funciona. Esto se explica aquí y se proporciona una solución alternativa (solo Bash):

#!/bin/bash
set -e 
set -o pipefail

./configure  | tee configure.log
make

Linux
  1. ¿Cómo pasar un argumento de línea de comando a un script de Shell?

  2. ¿Cómo saber si la salida de un comando o script de Shell es Stdout o Stderr?

  3. Usando el comando passwd desde dentro de un script de shell

  4. Establecer la variable de entorno en el script de shell/acceso en la aplicación Tomcat

  5. bash:establece la variable env de la matriz y falla la desreferenciación de cualquier script de shell

Comprender fácilmente los comandos de Shell usando el script "Explain Shell" en Linux

Cómo ejecutar el comando / secuencia de comandos de Linux Shell en segundo plano

Cómo almacenar un comando de Linux como una variable en el script de Shell

Shell Script Wrapper para evitar la ejecución de comandos sin argumentos?

¿La secuencia de comandos de Shell se bloquea en el comando de correo?

¿Cómo ejecutar un comando en un script de Shell?