Коды выхода в Linux: как перестать гадать, что сломалось

Молчаливый скрипт — это уже проблема

Каждый раз, когда команда в Linux завершает работу, она возвращает число в диапазоне от 0 до 255. Это единственный способ, которым скрипт сообщает миру: «всё в порядке» или «что-то пошло не так».

0 означает успех. Любое другое значение — это ошибка.

Что бывает, если системы нет

Скрипт завершился с кодом 1. И что это должно значить? Ничего не ясно. Другой скрипт завершился с 1. Тоже непонятно, хотя это уже совсем другой сценарий. CI/CD pipeline видит ошибку, но не понимает, как действовать дальше. Отладка превращается в гадание.

Как сделать это нормально: диапазоны

Разделите коды по смысловым группам:

0       -> успех
1-9     -> общие ошибки
10-19   -> плохие аргументы / входные данные
20-29   -> ошибки файловой системы
30-39   -> сеть
40-49   -> права доступа
50-99   -> внутренние ошибки

Коды 126-255 уже зарезервированы системой. Их лучше не использовать.

Давайте кодам понятные имена

Не пишите exit 20. Лучше оформить так:

EXIT_FILE_NOT_FOUND=20
EXIT_PERMISSION_DENIED=40
EXIT_NETWORK_FAIL=30

Так скрипт становится самодокументируемым. Через несколько месяцев вы сами себе за это скажете спасибо.

Вынесите коды в отдельный файл

Если у вас несколько скриптов, создайте exit_codes.sh и подключайте его через source exit_codes.sh.

Внешние команды нужно проверять всегда:

cp file1 file2
if [ $? -ne 0 ]; then
  echo "Копирование не удалось" >&2
  exit $EXIT_FILE_WRITE_ERROR
fi

Никогда не пропускайте статус выхода внешних команд. Ошибки, о которых ничего не сказано, обычно самые неприятные.

Описывайте ошибки в документации. Проверяйте не только успешные сценарии, но и падения. И оставляйте запас в диапазонах кодов на будущие случаи.

Именно такие мелочи отличают скрипт «на коленке» от production-ready инструмента.