Bash exit code — код, которым завершается выполнение скрипта. В случае успешного выполнения это 0, если произошли какие-то ошибки код отличается.
Этот код можно считывать и планировать логику в зависимости от него.
BASH exit code
Самое частое применение — скрипты, для которых нужно предусмотреть возможность прерывания и различные сценарии выполнения.
Например, с помощью bash exit code можно обработать исключение при закончившемся пространстве на диске при размещении на нем резервной копии данных. Или при автоматизированном переносе сайта с одного сервера на другой.
Большая часть программ возвращают 0 при успешном выполнении и коды отличные от нуля при возникновении ошибок.
Это 1 или другой код. Для каждой утилиты, которая фактически используется в скрипте и выполнение процесса запущенного с помощью которой завершается, имеет свои коды выхода. Все они описаны в документации.
На скриншоте приведен фрагмент из man grep относящийся к кодам выхода.
Подобную информацию можно найти по любому инструменту.
Часто используемая утилита 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, который говорит о неуспешном выполнении.
Таким действием обычно является запись информации в лог, отправка уведомления администратору или удаление временных файлов.