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