Автоматический выход из скрипта оболочки bash при ошибке



я писал некоторый сценарий оболочки, и я бы счел его полезным, если бы была возможность остановить выполнение указанного сценария оболочки, если какая-либо из команд не удалась. См. ниже для примера:



#!/bin/bash  

cd some_dir

./configure --some-flags

make

make install


поэтому в этом случае, если скрипт не может перейти в указанный каталог, то он, конечно же, не захочет этого делать ./ настроить после этого, если это не удается.



теперь я хорошо знаю, что у меня может быть проверка if для каждой команды (что я считаю безнадежным решением), но есть ли глобальная настройка для выхода скрипта, если одна из команд завершается неудачно?

695   7  

7 ответов:

использовать set -e builtin:

#!/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: возвращает конвейеру состояние выхода последней команды в канале, которая возвратила ненулевое возвращаемое значение.

глава 33. Варианты

альтернатива принятому ответу, который вписывается в первую строку:

#!/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

    Ничего не найдено.