Автоматический выход из Bash скрипта при ошибке
Описание проблемы:
Я пишу сценарий на Shell и было бы очень полезно иметь возможность остановить выполнение этого сценария, если любая из команд завершилась с ошибкой. Привожу пример:
#!/bin/bash
cd some_dir
./configure --some-flags
make
make install
В этом случае, если сценарий не сможет перейти в указанную директорию, нет смысла выполнять команду ./configure
, если она не удастся.
Я понимаю, что мог бы использовать проверку if
для каждой команды (что, по моему мнению, является совершенно неэффективным решением), но существует ли глобальная настройка, которая позволила бы сценарю завершаться, если одна из команд не выполнена успешно?
Заранее спасибо за помощь!
4 ответ(ов)
Чтобы выйти из скрипта сразу после того, как одна из команд завершилась с ошибкой, добавьте это в начале:
set -e
Это приведет к тому, что скрипт завершится немедленно, если какая-либо команда, не являющаяся частью какого-либо теста (например, в условии if [ ... ]
или конструкции &&
), вернет код завершения отличный от нуля.
Вот как это сделать:
#!/bin/sh
abort()
{
echo >&2 '
***************
*** ABORTED ***
***************
'
echo "Произошла ошибка. Выход..." >&2
exit 1
}
trap 'abort' 0
set -e
# Добавьте ваш скрипт ниже....
# Если произойдет ошибка, будет вызвана функция abort().
#----------------------------------------------------------
# ===> Ваш скрипт здесь
# Готово!
trap : 0
echo >&2 '
************
*** ГОТОВО ***
************
'
Этот скрипт использует обработку ошибок для выхода в случае каких-либо проблем. Функция abort
будет вызвана, если команда завершится с ошибкой, и выведет соответствующее сообщение. Не забудьте добавить ваш код между комментариями!
Вот альтернативный вариант:
#!/bin/bash -e
cd some_dir && ./configure --some-flags && make && make install
Этот однострочник делает то же самое, что и оригинал, но с использованием оператора &&
для последовательного выполнения команд.
В вашем примере используется цепочка команд в Unix-подобных системах для компиляции и установки программного обеспечения:
cd some_dir && ./configure --some-flags && make && make install
Это комбинация команд cd
, ./configure
, make
и make install
, соединённых с помощью оператора &&
, который гарантирует выполнение следующей команды только в случае успешного завершения предыдущей.
Хотя такая запись может показаться громоздкой, в больших сценариях действительно имеет смысл разбить код на логические функции для повышения читаемости и удобства сопровождения. Например, можно создать функции для каждой стадии (настройка, сборка, установка), чтобы сделать скрипт более структурированным. Это облегчает понимание происходящего и упрощает внесение изменений в будущем.
Пример разбивки на функции мог бы выглядеть так:
configure() {
./configure --some-flags
}
build() {
make
}
install() {
make install
}
main() {
cd some_dir || exit
configure && build && install
}
main
Таким образом, ваш скрипт будет более организованным и удобным в использовании.
Есть ли команда TRY CATCH в Bash?
Как проверить статус завершения с помощью оператора 'if'
Как выводить команды оболочки по мере их выполнения
Как узнать, в какой интерактивной оболочке я нахожусь (командная строка)
Расширение переменных внутри одинарных кавычек в команде Bash