Используйте функцию-обертку, чтобы выполнить ваши команды:
function __e {
set +e
"[email protected]"
__r=$?
set -e
}
__e yourcommand arg1 arg2
И использовать $__r
вместо $?
:
if [[ __r -eq 0 ]]; then
echo "success"
else
echo "failed"
fi
Другой метод для вызова команд в трубе, только то, что у вас есть процитировать трубку. Это делает безопасную оценку.
function __p {
set +e
local __A=() __I
for ((__I = 1; __I <= $#; ++__I)); do
if [[ "${!__I}" == '|' ]]; then
__A+=('|')
else
__A+=("\"\$$__I\"")
fi
done
eval "${__A[@]}"
__r=$?
set -e
}
Пример:
__p echo abc '|' grep abc
И я на самом деле предпочитают этот синтаксис:
__p echo abc :: grep abc
Что я мог сделать с
...
if [[ ${!__I} == '::' ]]; then
...
Из-за проблем, подобных этому, я бы рекомендовал НЕ использовать 'set -e' Вот еще несколько примеров: http://mywiki.wooledge.org/BashFAQ/105 – idfah
Не согласен. При использовании bash для настройки систем или другой, фактической работы 'set -e' имеет важное значение для показа корректности. – phs