Автоматический выход из скрипта оболочки bash при ошибке
я писал некоторый сценарий оболочки, и я бы счел его полезным, если бы была возможность остановить выполнение указанного сценария оболочки, если какая-либо из команд не удалась. См. ниже для примера:
#!/bin/bash
cd some_dir
./configure --some-flags
make
make install
поэтому в этом случае, если скрипт не может перейти в указанный каталог, то он, конечно же, не захочет этого делать ./ настроить после этого, если это не удается.
теперь я хорошо знаю, что у меня может быть проверка if для каждой команды (что я считаю безнадежным решением), но есть ли глобальная настройка для выхода скрипта, если одна из команд завершается неудачно?
7 ответов:
использовать
set -ebuiltin:#!/bin/bash set -e # Any subsequent(*) commands which fail will cause the shell script to exit immediatelyв качестве альтернативы, вы можете пройти
-eв командной строке:bash -e my_script.shвы также можете отключить это поведение с
set +e.(*) Примечание:
Панцирь не выход, если команда, которая не является частью список команд сразу после пока или до ключевое слово, часть испытания после если или Элиф зарезервированные слова, часть любой команды, выполняемой в && или |/ список кроме команды после финала && или |/ любая команда в конвейере, но последнее, или если возвращаемое значение команды инвертируется с помощью !
(от
man bash)
чтобы выйти из сценария, как только одна из команд не удалась, добавьте это в начале:
set -eэто приводит к тому, что скрипт немедленно завершает работу, когда какая-либо команда не является частью какого-либо теста (например, в
if [ ... ]условие или a&&построить) выходит с ненулевым кодом выхода.
вот как это сделать:
#!/bin/sh abort() { echo >&2 ' *************** *** ABORTED *** *************** ' echo "An error occurred. Exiting..." >&2 exit 1 } trap 'abort' 0 set -e # Add your script below.... # If an error occurs, the abort() function will be called. #---------------------------------------------------------- # ===> Your script goes here # Done! trap : 0 echo >&2 ' ************ *** DONE *** ************ '
использовать его в сочетании с
pipefail.set -e set -o pipefail- e (errexit): прервать сценарий при первой ошибке, когда команда завершает работу с ненулевым статусом (за исключением циклов до или во время, if-тестов, конструкций списка)
- o pipefail: возвращает конвейеру состояние выхода последней команды в канале, которая возвратила ненулевое возвращаемое значение.
альтернатива принятому ответу, который вписывается в первую строку:
#!/bin/bash -e cd some_dir ./configure --some-flags make make install
одна идиома:
cd some_dir && ./configure --some-flags && make && make installЯ понимаю, что может получиться долго, но для больших скриптов Вы можете разбить его на логические функции.
Я думаю, что то, что вы ищете-это :
trap command signal [signal ...]для получения дополнительной информации см. раздел на этой странице.
другой вариант-использовать
set -eкоманда в верхней части вашего скрипта - это заставит скрипт выйти, если какая-либо программа / команда возвращает неверное значение.
Comments