2009-07-02 24 views
22

In una sorta di try forma/catch voglio eseguire un bash che non si ferma in caso di errore.Eseguire un comando shell da uno script di shell senza fermarsi, se si verifica un errore

La bash specifico è:

#!/bin/sh 

invoke-rc.d tomcat stop 

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

voglio exec "tomcat invoke-rc.d stop" e anche se Tomcat non è in esecuzione, continuare ad eseguire gli altri comandi bash.

+6

Non è il comportamento predefinito di bash? Avrei potuto giurare che era (è necessario agire esplicitamente per terminare uno script se qualche comando fallisce ...) –

+0

Se si esegue questo script e tomcat non è in esecuzione, lo script interromperà l'esecuzione dal primo errore di restituzione del comando. Voglio che lo script continui. – JorgeO

+0

@Alex: è il valore predefinito ma esiste qualcosa che sovrascrive l'impostazione predefinita. –

risposta

28

Prova:

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

Un po 'di storia:

[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 vera soluzione sta guardando lo script di init gatto per vedere come si sa se Tomcat è in esecuzione :) In questo modo, non lo tormenta inutilmente.

Vedi this post dall'altra suggerimento per disinserire/set + e. Mentre risolverebbe il tuo problema immediato, potresti scoprire che hai bisogno del comportamento non impostato di recente nel tuo script, specialmente dal momento che stai copiando dei file.

Questo è uno dei principali motivi per cui sono stati costituiti veri e falsi, altri che fare Makefiles si comportano come previsto in una varietà di ambienti di build.

Inoltre, impostare + e non è del tutto portatile, vale a dire alcune versioni di Solaris (e anche Dash) .. ma dubito che questo è un problema per voi.

+0

Ho rimosso i percorsi del tuo codice e dell'utente root perché qualcuno potrebbe pensare che tu debba essere su.Spero non ti dispiaccia;) –

+0

@ hugict hugo - Grazie. Ho modificato questo post alcune volte e non sono riuscito a notare che ho lasciato intatti i percorsi :) Devo essere un po 'cerebrale oggi. –

+0

in realtà non capisco la parte 2> & 1 || vero. Capisco>/dev/null significa che l'errore viene reindirizzato lì ma non capisco né la sintassi né il significato dell'altra parte. Puoi spiegare? – Toskan

-3

Prova a reindirizzare l'errore standard in un file ... qualcosa come 2> myerror.

+0

Se visto qualcosa come comando>/dev/null. È qualcosa del genere? Questo renderà l'output del comando su un file. Ma capita anche l'errore? – JorgeO

+0

Questo non si ripristina dall'errore, semplicemente nasconde la causa. –

4

Usa bash's set command al comportamento disattivare temporaneamente l'uscita-on-diverso da zero.

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

Dovresti scrivere una piccola spiegazione del tuo script. Basta fare clic su "modifica". BTW Benvenuti in SO –

+0

set {args} non è sempre portatile. Tuttavia, se lo fai: set + e || { codice per far fronte a un guscio cerebrale morto } Va bene per qualsiasi cosa vale il suo sale in conformità POSIX. Universalmente, è molto più facile (e molto più portabile) usare solo vero/falso. –

28

disattivare l'opzione "uscire subito" con set +e, eseguire il comando, quindi opzionalmente riattivarla con set -e:

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

Vedi section 4.3.1 del manuale Bash per una spiegazione del set incorporato e tutte le sue varie opzioni (di cui ce ne sono molte).

1

Se invoke-rc.d tomcat stop è l'unica cosa che si desidera proteggere da errori, forse invoke-rc.d tomcat stop || vero può farlo? Questo non dovrebbe mai avere uno stato di uscita diverso da zero.

Problemi correlati