bash exit code и их использование в скриптах


Bash exit code — код, которым завершается выполнение скрипта. В случае успешного выполнения это 0, если произошли какие-то ошибки код отличается.

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



BASH exit code


Самое частое применение — скрипты, для которых нужно предусмотреть возможность прерывания и различные сценарии выполнения.

Например, с помощью bash exit code можно обработать исключение при закончившемся пространстве на диске при размещении на нем резервной копии данных. Или при автоматизированном переносе сайта с одного сервера на другой.



Большая часть программ возвращают 0 при успешном выполнении и коды отличные от нуля при возникновении ошибок.



Это 1 или другой код. Для каждой утилиты, которая фактически используется в скрипте и выполнение процесса запущенного с помощью которой завершается, имеет свои коды выхода. Все они описаны в документации.



На скриншоте приведен фрагмент из man grep относящийся к кодам выхода.

bash exim code


Подобную информацию можно найти по любому инструменту.

Часто используемая утилита awk всегда будет возвращать 0



Exit code может принимать значения от 0 до 256.



Вывести код выполнения последней команды в оболочке или в скрипте можно так:

echo $?


Это основной способ отладки любых bash скриптов. Можно выполнить скрипт целиком или его часть и проверить код вывода выстраивая процесс далее в зависимости от результата.



Для демонстрации будем использовать HTML файл со случайным текстом.

mcedit site.html

<html>

looki-for
</html>



Проверим равняется ли возвращаемое значение единице

grep 'looky-for' site.html ; if (( `echo $?` == 1 )); then echo ONE; fi

ONE


Код выхода говорит о том, что паттерн не найден в файле.

bash exit code можно просто выводить в консоль отдельно.


При обнаруженном совпадении:

grep 'looki-for' site.html ; echo $?

looki-for
0


Если совпадения нет:

grep 'lookri-for' site.html ; echo $?

1


Если произошла ошибка — например отсутствует файл в котором утилите grep дано указание искать

grep 'looki-for' site2.html ; echo $?

grep: site2.html: No such file or directory
2



Код выхода при написании скриптов


При написании скриптов стоит учитывать, что в приведенном выше примере речь идет об одной команде.

Если это несколько команд, выполняющиеся одна за другой ошибку можно пропустить проверяя exit code одной из них.


grep 'looki-for' site2.html ; echo $? ; echo 'hey'; echo $?

grep: site2.html: No such file or directory
2
hey
0


Поэтому лучше всего объединять последовательность команд в отдельный скрипт или функцию и проверять код выхода скрипта или функции.



Также можно использовать конструкцию set -e/trap:

set -e
      some bash code
trap
      what to do if errors detected



За счет нее также можно предусмотреть действие выполняемое в случае если bash скрипт возвращает exit code, который говорит о неуспешном выполнении.



Таким действием обычно является запись информации в лог, отправка уведомления администратору или удаление временных файлов.

Сказать спасибо