Po każdej komendzie kod wyjścia można znaleźć w $?
zmiennej, aby uzyskać coś takiego:
ls -al file.ext
rc=$?; if [[ $rc != 0 ]]; then exit $rc; fi
Trzeba uważać na polecenia potokowe, ponieważ $?
jedyne daje kod powrotu ostatniego elementu w potoku, więc w kodzie:
ls -al file.ext | sed 's/^/xx: /"
nie zwróci kodu błędu, jeśli plik nie istnieje (ponieważ sed
część potoku faktycznie działa, zwracając 0).
bash
Powłoka faktycznie zapewnia tablicę, która może pomóc w tej sprawie, że bycie PIPESTATUS
. Ta tablica ma jeden element dla każdego ze składników potoku, do którego można uzyskać dostęp indywidualnie, na przykład ${PIPESTATUS[0]}
:
pax> false | true ; echo ${PIPESTATUS[0]}
1
Zauważ, że otrzymujesz wynik false
polecenia, a nie cały potok. Możesz także przetworzyć całą listę według własnego uznania:
pax> false | true | false; echo ${PIPESTATUS[*]}
1 0 1
Jeśli chcesz uzyskać największy kod błędu z potoku, możesz użyć czegoś takiego:
true | true | false | true | false
rcs=${PIPESTATUS[*]}; rc=0; for i in ${rcs}; do rc=$(($i > $rc ? $i : $rc)); done
echo $rc
Przechodzi kolejno przez każdy z PIPESTATUS
elementów, przechowując go, rc
jeśli był większy niż poprzednia rc
wartość.