bash - pasar - Manejo de excepciones en scripts de shell
shell script ejemplos (4)
Estoy buscando el mecanismo de manejo de excepciones en el script de shell. ¿Hay alguna prueba, capturar un mecanismo equivalente en el script de shell?
Aquí hay dos funciones bash simples que permiten el manejo de eventos en bash:
Podrías usarlo para una excepción básica como esta:
onFoo(){
echo "onFoo() called width arg $1!"
}
foo(){
[[ -f /tmp/somefile ]] || throw EXCEPTION_FOO_OCCURED "some arg"
}
addListener EXCEPTION_FOO_OCCURED onFoo
Exceptionhandling usando try / catch blocks no es soportado en bash, sin embargo, puede intentar mirar el framework BANGSH que lo soporta (es un poco como jquery para bash).
Sin embargo , el manejo de excepciones sin try / catch-blocks en cascada es similar al manejo de eventos , que es posible en casi cualquier idioma con array-support.
Si desea mantener su código limpio y ordenado (sin verbosidad if / else), le recomendaría utilizar eventos.
La sugerencia que MatToufoutu recomienda (usando || y &&) no se recomienda para funciones, pero está bien para comandos simples . (ver BashPitfalls sobre los riesgos)
La estructura if / else y los códigos de salida pueden ayudarte a fingir algo de eso. Esto debería funcionar en Bash o Bourne (sh).
if foo ; then
else
e=$? # return code from if
if [ "${e}" -eq "1"]; then
echo "Foo returned exit code 1"
elif [ "${e}" -gt "1"]; then
echo "Foo returned BAD exit code ${e}"
fi
fi
No hay realmente un try/catch
en bash (supongo que estás usando bash), pero puedes lograr un comportamiento bastante similar usando &&
o ||
.
En este ejemplo, desea ejecutar a_command
si falla un a_command
(devuelve un valor distinto de cero):
a_command || fallback_command
Y en este ejemplo, desea ejecutar second_command
si a_command
tiene éxito (devuelve 0):
a_command && second_command
Pueden mezclarse fácilmente utilizando una subshell, por ejemplo, el siguiente comando ejecutará a_command
, si tiene éxito, ejecutará other_command
, pero si a_command
u a_command
falla, se ejecutará a_command
:
(a_command && other_command) || fallback_command
{
# command which may fail and give an error
} || {
# command which should be run instead of the above failing command
}