tomo - bash read variable
Salir de un script en caso de error (5)
Estoy construyendo un Shell Script que tiene una función if
como esta:
if jarsigner -verbose -keystore $keyst -keystore $pass $jar_file $kalias
then
echo $jar_file signed sucessfully
else
echo ERROR: Failed to sign $jar_file. Please recheck the variables
fi
...
Quiero que la ejecución del script termine después de mostrar el mensaje de error. ¿Como puedo hacer esto?
¿Estás buscando la exit
?
Esta es la mejor guía de bash. http://tldp.org/LDP/abs/html/
En contexto:
if jarsigner -verbose -keystore $keyst -keystore $pass $jar_file $kalias
then
echo $jar_file signed sucessfully
else
echo ERROR: Failed to sign $jar_file. Please recheck the variables 1>&2
exit 1 # terminate and indicate error
fi
...
Aquí está la manera de 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 ***
************
''
Si coloca set -e
en una secuencia de comandos, la secuencia de comandos terminará tan pronto como un comando dentro de ella falle (es decir, tan pronto como un comando devuelva un estado distinto de cero). Esto no le permite escribir su propio mensaje, pero a menudo los propios mensajes del comando que falla son suficientes.
La ventaja de este enfoque es que es automático: no corre el riesgo de olvidarse de ocuparse de un caso de error.
Los comandos cuyo estado es probado por un condicional (como if
, &&
o ||
) no terminan el script (de lo contrario, el condicional sería inútil). Un modismo para el comando ocasional cuya falla no importa es command-that-may-fail || true
command-that-may-fail || true
También puede desactivar set -e
off para una parte del script con set +e
.
Si desea poder manejar un error en lugar de salir a ciegas, en lugar de usar el set -e
, use una trap
en la pseudo señal ERR
.
#!/bin/bash
f () {
errcode=$? # save the exit code as the first thing done in the trap function
echo "error $errorcode"
echo "the command executing at the time of the error was"
echo "$BASH_COMMAND"
echo "on line ${BASH_LINENO[0]}"
# do some error handling, cleanup, logging, notification
# $BASH_COMMAND contains the command that was being executed at the time of the trap
# ${BASH_LINENO[0]} contains the line number in the script of that command
# exit the script or return to try again, etc.
exit $errcode # or use some other value or do return instead
}
trap f ERR
# do some stuff
false # returns 1 so it triggers the trap
# maybe do some other stuff
Se pueden configurar otras trampas para manejar otras señales, incluidas las señales Unix habituales más las otras señales de pseudo Bash RETURN
y DEBUG
.
exit 1
es todo lo que necesitas. El 1
es un código de retorno, por lo que puede cambiarlo si quiere, digamos, 1
para indicar una ejecución exitosa y -1
para indicar una falla o algo así.