
Команда set -e немедленно завершает работу bash-скрипта, если любая команда возвращает ненулевой код завершения.
Есть ли простой и элегантный способ отключить такое поведение для отдельной команды в скрипте?
В каких местах в справочном руководстве Bash задокументирована эта функциональность (http://www.gnu.org/software/bash/manual/bashref.html)?
решение1
Что-то вроде этого:
#!/usr/bin/env bash set -e echo hi # disable exitting on error temporarily set +e aoeuidhtn echo next line # bring it back set -e ao echo next line
Бегать:
$ ./test.sh hi ./test.sh: line 7: aoeuidhtn: command not found next line ./test.sh: line 11: ao: command not found
Это описано во
set
встроенной справке:$ type set set is a shell builtin $ help set (...) Using + rather than - causes these flags to be turned off.
То же самое задокументировано здесь:https://www.gnu.org/software/bash/manual/bashref.html#The-Set-Builtin.
решение2
Альтернативой отмене залога по ошибке было бы принудительное достижение успеха, несмотря ни на что. Вы можете сделать что-то вроде этого:
cmd_to_run || true
Это вернет 0 (истина), поэтому set -e не должен срабатывать.
решение3
Если вы пытаетесь перехватить код возврата/ошибки (функции или форка), это сработает:
function xyz {
return 2
}
xyz && RC=$? || RC=$?
решение4
Другой подход, который я нахожу довольно простым (и применим к другим set
вариантам в дополнение к -e
):
Используйте $-
для восстановления настроек.
Например:
oldopt=$-
set +e
# now '-e' is definitely disabled.
# do some stuff...
# Restore things back to how they were
set -$oldopt
Хотя -e
конкретно варианты, упомянутые другими ( || true
или «поместить внутрь if
»), могут быть более идиоматичными.