2012-10-22 16 views
7

Sto usando set -e per interrompere gli errori.Bash ignora l'errore e ottiene il codice di ritorno

Ma per una particolare funzione, voglio ignorare l'errore e all'errore voglio il codice di ritorno della funzione.

Esempio:

do_work || true 
if [ $? -ne 0 ] 
    then 
    echo "Error" 
    fi 

Ma non è il lavoro codice di ritorno è sempre vero a causa || true

Come ottenere il codice di ritorno su do_work in caso di errore?

+0

Perché non si disabilita l'uscita per errore subito prima di quella chiamata? – Mat

+0

@Mat ya che funzionerà grazie. Ma per scopo di conoscenza c'è un modo per catturare il codice di ritorno? –

risposta

6
do_work || { 
    status=$? 
    echo "Error" 
} 
4

Si potrebbe utilizzare una scorciatoia subshell:

(set +e; do_work) 
if [ $? -ne 0 ] 
    then 
    echo "Error" 
    fi 

Spero che questo aiuti =)

4

Un modo è quello di utilizzare un tubo, -e guarda solo al più a destra frutto di un tubo:

set -e 

do_work | true 

retn=${PIPESTATUS[0]} 
if (($retn != 0)) 
then 
    echo "Error $retn" 
fi  
echo Ending 

ho scritto un semplice do_work, che ha appena fatto exit 42 ed ha ottenuto il seguente risultato:

Error 42 
Ending 

L'array PIPESTATUS viene gestito da Bash, con ogni elemento che fornisce il codice di ritorno di ciascuna parte della pipeline. Dobbiamo catturarlo immediatamente (quindi $retn) poiché viene sovrascritto ad ogni comando.

Naturalmente questo potrebbe essere problematico se il tuo do_work include un tubo stesso.

1
do_work || status=$? 
if [ $status -ne 0 ] 
then 
    echo "Oh no - Fail whale $status has arrived" 
fi 
4

Molte delle risposte qui indicate non sono corretti, perché si traducono in un test contro una variabile che sarà non-definito se do_work riesce.

Abbiamo bisogno di coprire il caso di successo, così, quindi la risposta è:

set -eu 
do_work && status=0 || status=1 

La domanda del manifesto è un po 'ambiguo perché si dice nel testo "in caso di errore Voglio codice di ritorno", ma poi il codice significa "voglio sempre il codice di ritorno"

Per illustrare, qui è il codice problematico:

set -e 

do_work() { 
    return 0 
} 

status=123 

do_work || status=$? 
echo $status 

In questo codice il valore stampato è 123, e non 0 come potremmo h per favore.

Problemi correlati