¿Cómo salir si falló un comando? [duplicar]

Resuelto user459246 asked hace 14 años • 9 respuestas

Soy un novato en scripts de shell. Quiero imprimir un mensaje y salir de mi script si falla un comando. He intentado:

my_command && (echo 'my_command failed; exit)

Pero no funciona. Sigue ejecutando las instrucciones que siguen esta línea en el script. Estoy usando Ubuntu y bash.

user459246 avatar Sep 29 '10 21:09 user459246
Aceptado

Intentar:

my_command || { echo 'my_command failed' ; exit 1; }

Cuatro cambios:

  • Cambiar &&a||
  • Usar { }en lugar de( )
  • Introducir ;después exity
  • espacios después {y antes}

Como desea imprimir el mensaje y salir solo cuando el comando falla (sale con un valor distinto de cero), necesita un ||not an &&.

cmd1 && cmd2

se ejecutará cmd2cuando cmd1tenga éxito (valor de salida 0). Mientras

cmd1 || cmd2

se ejecutará cmd2cuando cmd1falle (valor de salida distinto de cero).

El uso ( )hace que el comando dentro de ellos se ejecute en un subshell y llamar a exitdesde allí hace que salga del subshell y no del shell original, por lo que la ejecución continúa en su shell original.

Para superar este uso{ }

bash requiere los dos últimos cambios.

codaddict avatar Sep 29 '2010 14:09 codaddict

Las otras respuestas han cubierto bien la pregunta directa, pero es posible que también le interese utilizar set -e. Con eso, cualquier comando que falle (fuera de contextos específicos como ifpruebas) hará que el script se cancele. Para ciertos scripts, es muy útil.

Daenyth avatar Sep 29 '2010 16:09 Daenyth

Si desea ese comportamiento para todos los comandos en su secuencia de comandos, simplemente agregue

set -e 
set -o pipefail

al comienzo del guión. Este par de opciones le dicen al intérprete de bash que salga cada vez que un comando regresa con un código de salida distinto de cero. (Para obtener más detalles sobre por qué pipefailes necesario, consulte http://petereisentraut.blogspot.com/2010/11/pipefail.html ).

Sin embargo, esto no le permite imprimir un mensaje de salida.

damienfrancois avatar Oct 19 '2013 18:10 damienfrancois