После каждой команды код выхода можно найти в $?переменной, так что вы получите что-то вроде:
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значение.