2013-09-30 16 views
5

chcę mieć działanie porządki w moich skryptach bash tak:Pobierz kod wyjścia skryptu powłoki w „pułapkę EXIT”

#! /bin/bash 
set -eu 
trap 'echo "E: failed with exitcode $?" 1>&2' ERR 

true 
false 

Korzystanie $? przyszło na myśl jako naturalny wybór, ale to tak nie jest. Zawsze zawiera 0. Czy jest jakiś sposób, że mogę "szpiegować" na ekwipunku w pułapce ERR?

[Aktualizacja:] Nie mam pojęcia, co testowałem wcześniej. Ten kod działa jak urok, więc zostawiam go tutaj jako mały i dobry przykład.

+0

myślę '$' jest poprawne. Twój skrypt wypisuje "1" dla mnie. – dogbane

+0

Hah, wiem, co poszło nie tak. Kiedy testowałem tę funkcję, napisałem jedną linijkę i błędnie zacytowałem. Mówiąc "pułapki" echo wychodzące z $? " ERR' wyraźnie nie działa, ponieważ '$?' Jest oceniany w _definicji_ działania 'pułapki'. –

+0

Dla każdego, kto szuka, [podobne pytanie jest tutaj] (http://stackoverflow.com/q/32086595/471376). – JamesThomasMoon1979

Odpowiedz

3

Państwa (prawdopodobnie uproszczony) przykład nie wykazuje już problemu wymienić:

+ set -eu 
+ trap 'echo "E: failed with exitcode $?" 1>&2' ERR 
+ true 
+ false 
++ echo 'E: failed with exitcode 1' 
E: failed with exitcode 1 

Są szanse, że polecenie powrotu ERR jest wykonywany w && lub || lub podlegać innym warunkom wymienione w poniższym fragmencie. Cytując z manual:

Jeśli sigspec jest ERR komenda arg jest wykonywany, gdy prosty komenda ma status niezerową wyjścia, z zastrzeżeniem następujących warunków . ERR pułapka nie jest wykonywana, gdy nie powiodła się komenda jest częścią listy poleceń natychmiast po dokonaniu until lub while słowa kluczowego, część testu następstwie if lub elif zastrzeżone słowy częścią wykonanego polecenia listy && lub || lub jeśli status powrotu komendy jest odwracany za pomocą !. Są to te same warunki, które są spełnione przez opcję errexit.

Więc jeśli masz, na przykład, następujące:

#! /bin/bash 
set -eu 
trap 'echo "E: failed with exitcode $?" 1>&2' ERR 

false && true 

Wykonywany nie spowoduje niepowodzeniezostać uwięziony?

+ set -eu 
+ trap 'echo "E: failed with exitcode $?" 1>&2' ERR 
+ false