8

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

1

Описание проблемы:

Я пишу сценарий на Shell и было бы очень полезно иметь возможность остановить выполнение этого сценария, если любая из команд завершилась с ошибкой. Привожу пример:

#!/bin/bash

cd some_dir

./configure --some-flags

make

make install

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

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

Заранее спасибо за помощь!

4 ответ(ов)

0

Чтобы выйти из скрипта сразу после того, как одна из команд завершилась с ошибкой, добавьте это в начале:

set -e

Это приведет к тому, что скрипт завершится немедленно, если какая-либо команда, не являющаяся частью какого-либо теста (например, в условии if [ ... ] или конструкции &&), вернет код завершения отличный от нуля.

0

Вот как это сделать:

#!/bin/sh

abort()
{
    echo >&2 '
***************
*** ABORTED ***
***************
'
    echo "Произошла ошибка. Выход..." >&2
    exit 1
}

trap 'abort' 0

set -e

# Добавьте ваш скрипт ниже....
# Если произойдет ошибка, будет вызвана функция abort().
#----------------------------------------------------------
# ===> Ваш скрипт здесь
# Готово!
trap : 0

echo >&2 '
************
*** ГОТОВО *** 
************
'

Этот скрипт использует обработку ошибок для выхода в случае каких-либо проблем. Функция abort будет вызвана, если команда завершится с ошибкой, и выведет соответствующее сообщение. Не забудьте добавить ваш код между комментариями!

0

Вот альтернативный вариант:

#!/bin/bash -e

cd some_dir && ./configure --some-flags && make && make install

Этот однострочник делает то же самое, что и оригинал, но с использованием оператора && для последовательного выполнения команд.

0

В вашем примере используется цепочка команд в 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

Таким образом, ваш скрипт будет более организованным и удобным в использовании.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь