Після кожної команди код виходу можна знайти у $?
змінній, щоб у вас вийшло щось на зразок:
ls -al file.ext
rc=$?; if [[ $rc != 0 ]]; then exit $rc; fi
Вам потрібно бути обережним з трубопровідними командами, оскільки $?
єдиний дає вам зворотний код останнього елемента в трубі, таким чином, у коді:
ls -al file.ext | sed 's/^/xx: /"
не поверне код помилки, якщо файл не існує (оскільки sed
частина конвеєра насправді працює, повертаючи 0).
bash
Оболонка фактично забезпечує масив , який може допомогти в цьому випадку, що бути PIPESTATUS
. Цей масив містить один елемент для кожного з компонентів трубопроводу, до якого ви можете отримати доступ окремо, як ${PIPESTATUS[0]}
:
pax> false | true ; echo ${PIPESTATUS[0]}
1
Зауважте, що це дає вам результат false
команди, а не весь конвеєр. Ви також можете отримати весь список для обробки, як вважаєте за потрібне:
pax> false | true | false; echo ${PIPESTATUS[*]}
1 0 1
Якщо ви хочете отримати найбільший код помилки з конвеєра, ви можете використовувати щось на кшталт:
true | true | false | true | false
rcs=${PIPESTATUS[*]}; rc=0; for i in ${rcs}; do rc=$(($i > $rc ? $i : $rc)); done
echo $rc
Це по PIPESTATUS
черзі проходить кожен з елементів, зберігаючи його, rc
якщо воно було більше попереднього rc
значення.