3

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

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. Проблема в том, что скобка работает как функция со своей областью действия, а возвращаемое значение 1 не будет иметь ожидаемого поведения.

Это то, что я до сих пор, но это не идеально:

! do_something && log_error && return 1

Проблема в том, что это! сбивает с толку, и возвращение 1 зависит от успешности регистрации.

Этот лучше, но более многословный:

do_something || (log_error; return 1) || return 1

Какие-нибудь мысли?

2 ответа2

4

Используйте брекеты.

 do_something || { log_error; return 1;}
1

Состояние завершения последнего запуска команды сохраняется в $? переменная. Итак, вы можете сделать что-то вроде следующего:

do something
if [[ $? > 0 ]]; then 
   do log_error; exit 1; 
fi

Мне нравится это для удобства чтения. Однако, у вас все отлично, вам просто нужно заменить && на ;:

! do_something && log_error ; return 1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .