Вопрос или проблема
Есть скрипт 1.sh
. 1.sh
запускает 1a.sh
, а затем 1b.sh
.
Но как выйти из всех скриптов, как выйти из 1.sh
и как не запускать 1b.sh
, если 1b.sh
завершится с ошибкой?
Просто сделайте это так:
#! /bin/sh -
1a.sh && 1b.sh
Или
#! /bin/sh -
1a.sh || exit
1b.sh
Или:
#! /bin/sh -
set -o errexit
1a.sh
1b.sh
Как вы бы сделали для каждой команды. То, что эти команды являются оболочечными скриптами (программами, написанными на языке оболочки; кстати, так мы не называем подсистемы) или нет (программами, написанными на другом языке, интерпретируемом или нет), здесь не имеет значения.
Ответ или решение
Чтобы корректно завершить выполнение скрипта 1.sh
, если один из подскриптов (1a.sh
или 1b.sh
) завершится с ошибкой, можно применить несколько подходов. Все они обеспечат прерывание выполнения скрипта и выход из него в случае ошибки:
-
Использование оператора логического AND (
&&
):
Этот метод позволяет запускать следующий скрипт только в случае успешного завершения предыдущего.#! /bin/sh - 1a.sh && 1b.sh
В этом случае, если
1a.sh
завершится с ошибкой,1b.sh
не будет выполнен. -
Использование оператора логического OR (
||
):
Здесь можно явно указать выход из скрипта в случае ошибки:#! /bin/sh - 1a.sh || exit 1b.sh
Если
1a.sh
завершится с ошибкой, будет выполнена командаexit
, и выполнение1b.sh
будет прервано. -
Установка опции
errexit
:
Это более общий способ, который следует применять, когда требуется, чтобы любой неуспешный выходной статус завершал текущий скрипт:#! /bin/sh - set -o errexit 1a.sh 1b.sh
В этом случае, если любой из скриптов (
1a.sh
или1b.sh
) завершится неудачно, выполнение скрипта1.sh
будет автоматически прервано.
Каждый из этих методов поможет вам избежать выполнения следующего скрипта в случае, если предыдущий завершается с ошибкой. Выбор метода зависит от ваших предпочтений и требований к структуре скрипта. Вы можете использовать любой из предложенных вариантов, чтобы добиться желаемого поведения скриптов.