
Я привык к такому стилю в других языках:
do_something || (log_error; return 1) # do something, and if that fails, log the error and then return 1 no matter what, even if the logging fails.
Но я не могу найти эквивалент в bash. Проблема в том, что скобки работают как функция со своей собственной областью действия, и return 1 не будет иметь ожидаемого поведения.
Вот что у меня есть на данный момент, но это не идеально:
! do_something && log_error && return 1
Проблема в том, что ! сбивает с толку, а возврат 1 зависит от успешности регистрации.
Этот вариант лучше, но более подробен:
do_something || (log_error; return 1) || return 1
Есть предположения?
решение1
Используйте брекеты.
do_something || { log_error; return 1;}
решение2
Статус выхода последней выполненной команды сохраняется в $?
переменной. Таким образом, вы можете сделать что-то вроде следующего:
do something
if [[ $? > 0 ]]; then
do log_error; exit 1;
fi
Мне нравится это для удобства чтения. Однако ваш вариант вполне хорош, вам просто нужно заменить &&
на ;
:
! do_something && log_error ; return 1
&&
означает «выполнить следующую команду ТОЛЬКО ЕСЛИ предыдущая завершилась успешно», а ;
просто означает «выполнить следующую команду».