2012-10-22 17 views
7

Używam set -e do przerywania błędów.Bash zignoruj ​​błąd i uzyskaj kod powrotu

Ale dla jednej funkcji chcę zignorować błąd i błąd Chcę kod powrotu funkcji.

Przykład:

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

Ale to nie jest praca kod zwrotny jest zawsze prawdziwe powodu || true

Jak uzyskać kod powrotu na do_work w przypadku błędu?

+0

Dlaczego nie wyłączyć wyjścia w przypadku błędu tuż przed wywołaniem? – Mat

+0

@Mat ya, który będzie działał dzięki. Ale dla celów wiedzy istnieje sposób, w jaki mogę uchwycić kod powrotu? –

Odpowiedz

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

Można użyć skrótu powłoki w tle:

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

Hope this helps =)

4

Jednym ze sposobów jest użycie rury, -e wygląda tylko na skrajnym prawym wyniku rurze:

set -e 

do_work | true 

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

napisałem prosty do_work który właśnie zrobił exit 42 i uzyskałem następujący wynik:

Error 42 
Ending 

Macierz PIPESTATUS jest obsługiwana przez Bash, a każdy element podaje kod powrotu każdej części potoku. Musimy go przechwycić od razu (stąd $retn), ponieważ jest on nadpisywany przy każdym poleceniu.

Oczywiście może to być problematyczne, jeśli Twoja do_work zawiera samą rurę.

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

Kilka z odpowiedzi udzielonych tutaj nie są poprawne, ponieważ wynikają one w teście przed zmienną, która będzie un zdefiniowane jeśli do_work powiedzie.

Musimy pokryć udany przypadek, tak więc odpowiedź brzmi:

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

plakatu pytanie jest trochę niejednoznaczne, ponieważ mówi się w tekście „w przypadku błędu chcę kodu powrotu”, ale potem kod zakłada „zawsze chcę kod zwrotny”

Aby zilustrować, oto kod problematyczne:

set -e 

do_work() { 
    return 0 
} 

status=123 

do_work || status=$? 
echo $status 

W tym kodzie wartość drukowana jest 123, a nie jak moglibyśmy 0 h ope for.

Powiązane problemy