Как я могу написать скрипт оболочки, который завершится, если одна из его частей выйдет из строя? Например, если следующий фрагмент кода завершится неудачей, скрипт должен завершиться.
n=0
until [ $n -ge 5 ]
do
gksu *command* && break
n=$[$n+1]
sleep 3
bash
scripting
error-handling
Weylyn
источник
источник
set -e
функции. Это действительно не применимо здесь, хотя. ОП хочет выйти из сценария после 5 неудачных попыток выполнить команду.set -e
это единственный способ, который я знаю, чтобы сделать это.set -e
этоsleep
(break
будучи специальной встроенной команды вызовет сценарий выхода на неудачу в большинстве оболочек, командif
или слева от&&
не влияетset -e
,n=...
может потерпеть неудачу , еслиn
это только для чтения, но потом это также вышло бы из сценарияset -e
), так что интерпретация кажется маловероятной. Я согласен, что вопрос плохо сформулирован.Вы можете выйти из скрипта в любом месте, используя ключевое слово
exit
. Вы также можете указать код завершения, чтобы указать другим программам, что или как ваш сценарий вышел из строя, например,exit 1
иexit 2
т. Д. (Условно, код завершения 0 предназначен для успеха, а все, что больше 0, означает сбой; однако, также по соглашению, выход коды выше 127 зарезервированы для аварийного завершения (например, по сигналу)).Общая конструкция для выхода из строя
с подходящими
failure condition
иn
. Но в определенных сценариях вы можете действовать иначе. Теперь для вашего случая я интерпретирую ваш вопрос, что если какой-либо из пяти вызововgksu
потерпел неудачу, то вы собираетесь выйти. Одним из способов является использование такой функцииа затем вызвать цикл с помощью
try_command
.Существуют (более) продвинутые или сложные способы решения вашего вопроса. Однако приведенное выше решение более доступно для начинающих, чем, скажем, решение Стефана.
источник
exit
выходит из сценария, если он не вызывается в подоболочке. Если эта часть скрипта в субоболочке, например , потому что это в пределах(...)
или$(...)
или части трубы линии, то это будет только выйти из этого подоболочки .В этом случае, если вы хотите, чтобы скрипт завершал работу в дополнение к подоболочке, вам нужно будет вызвать
exit
выход из этой подоболочки.Например, здесь с 2 вложенными уровнями подоболочек:
Это может стать сложнее, если подоболочка является частью конвейера.
bash
имеет специальный$PIPESTATUS
массив, похожий наzsh
«s$pipestatus
один , который может помочь вам здесь:источник
Ловушка выполнит действие при получении сигнала.
Запустите это и дайте ему выйти нормально. Ловит сигнал 0.
Запустите его снова и прервите с помощью ^ C. Он захватывает как сигнал 2, так и сигнал 0.
Ненулевой статус выхода будет ловушкой ERR
источник