Как выполнить команду, а в случае ее неудачи выполнить другую команду и вернуть 1?

Как выполнить команду, а в случае ее неудачи выполнить другую команду и вернуть 1?

Я привык к такому стилю в других языках:

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

&&означает «выполнить следующую команду ТОЛЬКО ЕСЛИ предыдущая завершилась успешно», а ;просто означает «выполнить следующую команду».

Связанный контент