У меня недостаточно репутации, чтобы комментировать, но в принятом ответе пропущен закрывающий }
в строке 5.
После исправления код выдаст -ne: unary operator expected
ошибка, которая указывает на проблему: PIPESTATUS
перезаписывается условным условием после команды if
, поэтому возвращаемое значение process_commands
никогда не будет проверяться!
Это потому, что [ ${PIPESTATUS[0]} -ne 0 ]
эквивалентно test ${PIPESTATUS[0]} -ne 0
, что меняет $PIPESTATUS
, как и любая другая команда.Например:
return0 () { return 0;}
return3 () { return 3;}
return0 | return3
echo "PIPESTATUS: ${PIPESTATUS[@]}"
Возвращает PIPESTATUS: 0 3
, как и ожидалось.Но что, если мы введем условные выражения?
return0 | return3
if [ ${PIPESTATUS[0]} -ne 0 ]; then
echo "1st command error: ${PIPESTATUS[0]}"
elif [ ${PIPESTATUS[1]} -ne 0 ]; then
echo "2nd command error: ${PIPESTATUS[1]}"
else
echo "PIPESTATUS: ${PIPESTATUS[@]}"
echo "Both return codes = 0."
fi
Мы получаем ошибку [: -ne: unary operator expected
, и это:
PIPESTATUS: 2
Both return codes = 0.
Чтобы исправить это, $PIPESTATUS
должен храниться в другом массивепеременная, например:
return0 | return3
TEMP=("${PIPESTATUS[@]}")
echo "TEMP: ${TEMP[@]}"
if [ ${TEMP[0]} -ne 0 ]; then
echo "1st command error: ${TEMP[0]}"
elif [ ${TEMP[1]} -ne 0 ]; then
echo "2nd command error: ${TEMP[1]}"
else
echo "TEMP: ${TEMP[@]}"
echo "All return codes = 0."
fi
, которая печатает:
TEMP: 0 3
2nd command error: 3
, как и предполагалось.
Редактировать: я исправил принятый ответ, но я оставляю это объяснениедля потомков.