tag editar easytag linux bash exit exitstatus

linux - editar - ¿Cómo salir si falla un comando?



linux easytag (9)

El shell integrado trap permite señales de captura y otras condiciones útiles, incluida la ejecución de comandos fallidos (es decir, un estado de devolución distinto de cero). Por lo tanto, si no desea probar explícitamente el estado de devolución de cada comando, puede decir trap "your shell code" ERR y el código del shell se ejecutará cada vez que un comando devuelva un estado distinto de cero. Por ejemplo:

trap "echo script failed; exit 1" ERR

Tenga en cuenta que, al igual que en otros casos de captura de comandos fallidos, las tuberías necesitan un tratamiento especial; lo anterior no captará false | true false | true

Soy un novato en shell-scripting. 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 a esta línea en el script. Estoy usando Ubuntu y bash.


He pirateado el siguiente modismo:

echo "Generating from IDL..." idlj -fclient -td java/src echo.idl if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi echo "Compiling classes..." javac *java if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi echo "Done."

Preceda cada comando con un eco informativo, y siga cada comando con ese mismo
if [ $? -ne 0 ];... if [ $? -ne 0 ];... línea. (Por supuesto, puede editar ese mensaje de error si lo desea).


Las otras respuestas han cubierto bien la pregunta directa, pero también puede interesarle usar set -e . Con eso, cualquier comando que falle (fuera de contextos específicos como if tests) hará que la secuencia de comandos aborte. Para ciertos guiones, es muy útil.



Si quieres ese comportamiento para todos los comandos en tu script, simplemente agrega

set -e set -o pipefail

al comienzo del guion. Este par de opciones le dice al intérprete bash que salga cada vez que un comando retorna con un código de salida distinto de cero.

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


Siempre que my_command esté diseñado canónicamente, es decir , devuelve 0 cuando tiene éxito, entonces && es exactamente lo contrario de lo que desea. Tu quieres || .

También tenga en cuenta que ( no me parece correcto en bash, pero no puedo intentarlo desde donde estoy. Dígame.

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


También puede usar, si desea conservar el estado de error de salida, y tener un archivo legible con un comando por línea:

my_command1 || exit $? my_command2 || exit $?

Esto, sin embargo, no imprimirá ningún mensaje de error adicional. Pero en algunos casos, el error se imprimirá por el comando fallido de todos modos.


Tenga en cuenta también que el estado de salida de cada comando se almacena en la variable de shell $ ?, que puede verificar inmediatamente después de ejecutar el comando. Un estado distinto de cero indica falla:

my_command if [ $? -eq 0 ] then echo "it worked" else echo "it failed" fi


Tratar:

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

Cuatro cambios:

  • Cambiar && a ||
  • Usa { } en lugar de ( )
  • Presentar ; después de la exit y
  • espacios después de { y antes }

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

cmd1 && cmd2

ejecutará cmd2 cuando cmd1 (valor de salida 0 ). Donde como

cmd1 || cmd2

ejecutará cmd2 cuando falle cmd1 (valor de salida distinto de cero).

El uso ( ) hace que el comando dentro de ellos se ejecute en un subconjunto y llamar a una exit desde allí hace que salga del subconjunto y no del intérprete de comandos original, por lo tanto, la ejecución continúa en el intérprete de comandos original.

Para superar este uso { }

Los últimos dos cambios son requeridos por bash.