2011-08-05 65 views
60

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?¿Manejo de excepciones en scripts de shell?

+0

relacionadas: [Podría alguien explicar este try/alternativo de captura en bash?] (Http://stackoverflow.com/q/14964529/320399) – blong

Respuesta

93

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 fallback_command si a_commandfalla (devuelve un valor distinto de cero):

a_command || fallback_command 

Y en este ejemplo, se desea ejecutar second_command si a_commandes exitosa (devuelve 0):

a_command && second_command 

que fácilmente se pueden mezclar entre sí mediante el uso de una subcapa, por ejemplo, la Follo comando ala ejecutará a_command, si tiene éxito se ejecute other_command, pero si a_command o other_command falla, fallback_command será ejecutada:

(a_command && other_command) || fallback_command 
+11

Bonus: si quieres " finalmente "como comportamiento, use el no-op (: en bash) como este:' (a_command ||:) 'y la siguiente línea se ejecutará como si no hubiera ningún error en' a_command'. –

10

La estructura if/else y salida códigos te pueden ayudar falso algo de él. 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 
+1

'if foo; luego else' se puede simplificar a 'if! foo; then', +1 de todos modos. – jlliagre

+2

@jiliagre Eso no funciona. "! foo" invierte $? de 0 a 1 y! 0 a 0. – brightlancer

+0

De hecho. Pasé por alto el procesamiento del código de retorno. – jlliagre

2

Éstos son two simple bashfunctions which enable eventhandling en bash:

se podría utilizar para ExceptionHandling básico como esto:

onFoo(){ 
    echo "onFoo() called width arg $1!" 
} 

foo(){ 
    [[ -f /tmp/somefile ]] || throw EXCEPTION_FOO_OCCURED "some arg" 
} 

addListener EXCEPTION_FOO_OCCURED onFoo 

ExceptionHandling utilizando bloques try/catch no se admite en bash, sin embargo, es posible que Quiero probar mirando el marco BANGSH que lo soporta (es un poco como jquery para bash).

Sin embargo, ExceptionHandling sin derramamiento try/catch-bloques es similar a eventhandling, que es posible en casi cualquier lenguaje con el arreglo de apoyo.

Si desea mantener su código limpio y ordenado (sin if/else verbosity), le recomendaría utilizar eventos.

La sugerencia la que recomienda MatToufoutu (usando || y & &) no se recomienda para las funciones, pero bien para comandos simples. (Ver BashPitfalls sobre los riesgos)

2
{ 
     # command which may fail and give an error 
    } || { 
     # command which should be run instead of the above failing  command 
    } 
+0

Probablemente sería 'mejor' si le explicaste a la persona que hace la pregunta, el pseudo-código que publicas en lugar de solo un bloque de código críptico que pueden no entender. Si un niño no puede entenderlo, no es una buena respuesta. – Yokai