У меня есть сценарий оболочки Bash, который вызывает ряд команд. Я хотел бы, чтобы скрипт оболочки автоматически завершал работу с возвращаемым значением 1, если какая-либо из команд возвращает ненулевое значение.
Возможно ли это без явной проверки результата каждой команды?
например
dosomething1
if [[ $? -ne 0 ]]; then
exit 1
fi
dosomething2
if [[ $? -ne 0 ]]; then
exit 1
fi
set -e
, также делатьset -u
(илиset -eu
).-u
положил конец идиотскому, скрывающему ошибки поведению, в котором вы можете получить доступ к любой несуществующей переменной и получить пустое значение без диагностики.Ответы:
Добавьте это в начало сценария:
Это приведет к немедленному завершению работы оболочки при выходе из простой команды с ненулевым значением выхода. Простая команда - это любая команда, не являющаяся частью теста if, while или before, или частью && или || список.
Смотрите страницу руководства bash (1) во внутренней команде set для более подробной информации.
Лично я запускаю почти все сценарии оболочки с помощью команды "set -e". Это действительно раздражает иметь сценарий упорно продолжать, когда что-то не в середине и перерывов предположений для остальной части скрипта.
источник
bash script.sh
.set -e; tf() { false; }; tf; echo 'still here'
. Даже безset -e
внутренней частиtf()
, выполнение отменяется. Возможно, вы хотели сказать, чтоset -e
не наследуется подоболочками , что является правдой.Добавить к принятому ответу:
Имейте в виду, что
set -e
иногда этого недостаточно, особенно если у вас есть трубы.Например, предположим, у вас есть этот скрипт
... который работает как ожидалось: ошибка в
configure
прерывании выполнения.Завтра вы делаете, казалось бы, тривиальные изменения:
... и теперь это не работает. Это объясняется здесь , и предоставляется обходной путь (только Bash):
источник
pipefail
чтобы идти вместе сset -o
!Операторы if в вашем примере не нужны. Просто сделайте это так:
Если вы прислушиваетесь к совету Вилле Лаурикари и используете его,
set -e
то для некоторых команд вам может понадобиться следующее:Команда
|| true
заставит конвейер команд иметьtrue
возвращаемое значение, даже если команда не выполнена, поэтому-e
опция не уничтожит скрипт.источник
set -e
не является bash-centric - он поддерживается даже на оригинальной Bourne Shell.Если у вас есть очистка, которую вы должны сделать при выходе, вы также можете использовать 'trap' с псевдосигналом ERR. Это работает так же, как захват INT или любого другого сигнала; bash генерирует ERR, если какая-либо команда завершается с ненулевым значением:
Или, особенно если вы используете "set -e", вы можете перехватить EXIT; Ваша ловушка будет выполняться, когда скрипт завершит работу по любой причине, включая нормальное завершение, прерывания, завершение, вызванное параметром -e, и т. д.
источник
$?
Переменная редко. Псевдо-идиомаcommand; if [ $? -eq 0 ]; then X; fi
всегда должна быть записана какif command; then X; fi
.Случаи, когда
$?
требуется, это когда нужно проверить по нескольким значениям:или когда
$?
необходимо повторно использовать или иным образом манипулировать:источник
Запустите его с
-e
илиset -e
наверху.Также посмотрите на
set -u
.источник
help set
:-u
обрабатывает ссылки на неустановленные переменные как ошибки.set -u
илиset -e
не оба? @lumpynoseВыражение как
остановит обработку, когда одна из команд вернется с ненулевым значением. Например, следующая команда никогда не напечатает «done»:
источник
должно хватить.
источник
просто добавлю еще один для справки, поскольку у Марка Эдгарса был дополнительный вопрос, и вот еще один пример, который затрагивает общую тему:
что так же,
cmd || exit errcode
как кто-то показал.например. Я хочу убедиться, что раздел отключен, если смонтирован:
источник
[[
cmd`]] `это не одно и то же. Значение false, если вывод команды пустой, и true в противном случае, независимо от состояния выхода команды.