2010-12-17 16 views
6

Obecnie zastanawiam się, jak wykonać obsługę błędów dla poleceń łańcuchowych. po to tylko przykład, aby łatwo wykazać mój problem:obsługa błędów z połączonymi poleceniami (potokami) w skrypcie basha?

cat file | gzip >/tmp/test 

jeśli kot nie (bo np plik brakuje), gzip jest nadal realizowane, a więc ostatni zapisany kod wyjścia w $? to . set -e nie pomoże w tym przypadku.

Zastanawiam się, jakie jest najlepsze rozwiązanie?

dziękuję!

+0

Czy próbowałeś '$ PIPESTATUS'? Powinno działać dla basha. – khachik

+0

Nie wiedziałem nawet, że to istniało. dzięki! – aurora

Odpowiedz

8

Spróbuj tego:

trap 'echo "ERR caught"' ERR 
set -o pipefail 
cat file | gzip >/tmp/test 

Plik wyjściowy nadal będą tworzone (tworzenie odbywa się równolegle) i gzip zostanie uruchomiony, ale można zrobić porządki. Użyj tablicy ${PIPESTATUS[@]}, aby zobaczyć, gdzie wystąpił błąd. Możesz użyć $BASH_COMMAND i $BASH_LINENO, aby uzyskać dodatkowe informacje dotyczące błędu.

+0

Wow - to bardzo fajne. nie wiedziałem o tej możliwości. Dziękuję bardzo! – aurora