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