2009-07-02 16 views
22

En una especie de formulario try/catch, quiero ejecutar un bash que no se detiene si ocurre un error.Ejecutar un comando de shell desde un script de shell sin detenerse si se produce un error

La fiesta específica es:

#!/bin/sh 

invoke-rc.d tomcat stop 

rm -fr /var/webapps/ 
cp -R $WEBAPP /var/webapps/ 
invoke-rc.d tomcat start 

Quiero Exec "detener Tomcat invoke-rc.d" e incluso si no se está ejecutando Tomcat, sigue ejecutando a los otros comandos bash.

+6

¿No es el comportamiento predeterminado de bash? Podría haber jurado que era (debe tomar medidas explícitas para terminar un script si falla algún comando ...) –

+0

Si ejecuta este script y tomcat no se está ejecutando, el script detendrá la ejecución ya que el primer comando devuelve un error. Quiero que el script continúe. – JorgeO

+0

@Alex: es predeterminado pero hay algo que anula la configuración predeterminada. –

Respuesta

28

Probar:

invoke-rc.d tomcat stop > /dev/null 2>&1 || true 

Un poco de historia:

[email protected]: # true 
[email protected]: # echo $? 
0 
[email protected]: # false 
[email protected]: # echo $? 
1 

[email protected]: # which true 
/bin/true 
[email protected]: # which false 
/bin/false 

La verdadera soluciónestá mirando a la secuencia de comandos de inicio de Tomcat para ver cómo se sabe si se está ejecutando Tomcat :) De esta manera, no lo molestes innecesariamente

Consulte this post en la otra sugerencia para desarmar/configurar + e. Si bien resolvería su problema inmediato, puede encontrar que necesita el comportamiento recientemente desarmado en su propia secuencia de comandos, especialmente porque está copiando archivos.

Esta es una de las principales razones por las cuales se hicieron verdaderos y falsos, además de hacer que los Makefiles se comporten como se espera en una variedad de entornos de construcción.

Además, set + e no es completamente portátil, es decir, algunas versiones de Solaris (e incluso Dash) .. pero dudo que esto sea una preocupación para usted.

+0

Eliminé las rutas de acceso de tu código y del usuario raíz porque alguien podría pensar que debes ser su.Espero que no te importe;) –

+0

@victor hugo - Gracias. Edité esta publicación un par de veces y no me di cuenta de que había dejado los caminos intactos :) Hoy debo estar un poco muerto de cerebro. –

+0

en realidad no entiendo la parte 2> & 1 || cierto. Entiendo>/dev/null significa que el error se redirecciona allí pero no entiendo la sintaxis ni el significado de la otra parte. ¿Puedes explicarlo? – Toskan

-3

Intente redirigir el error estándar a un archivo ... algo así como 2> myerror.

+0

Si se ve algo como command>/dev/null. ¿Es algo como eso? Esto hará que la salida del comando vaya a un archivo. ¿Pero también capta el error? – JorgeO

+0

Esto no se recupera del error, simplemente oculta la causa. –

4

Utilice bash's set command para deshabilitar temporalmente el comportamiento de salida en caso de cero.

set +e 
invoke-rc.d tomcat stop 
set -e 
+0

Debe escribir una pequeña explicación de su script. Simplemente haga clic en 'editar'. Por cierto, bienvenido a SO –

+0

set {args} no siempre es portátil. Sin embargo, si lo hace: conjunto + e || { código para hacer frente a una carcasa con muerte cerebral } Está bien para cualquier cosa que valga la pena en conformidad con POSIX. Universalmente, es mucho más fácil (y mucho más portátil) usar true/false. –

28

Desactivar la opción "salida inmediata" con set +e, ejecutar su comando, a continuación, opcionalmente volver a habilitarla con set -e:

set +e 
invoke-rc.d tomcat stop 
set -e # optional 

Ver section 4.3.1 del manual de Bash para una explicación de la set incorporado y todas sus diversas opciones (de las cuales hay muchas).

1

Si Tomcat invoke-rc.d detener es lo único que desea proteger contra su defecto, tal vez deje de Tomcat invoke-rc.d || cierto puede hacerlo? Eso nunca debería tener un estado de salida distinto de cero.

Cuestiones relacionadas