Gymterview
junior

Что такое exit codes и как с ними работать?

Exit code (код возврата) — целое число от 0 до 255, которое каждый процесс возвращает операционной системе при завершении. Это стандартный механизм сообщения об успешности выполнения: 0 означает успех, любое другое значение — ошибку.

Аналогия: exit code — это как ответ курьера: «доставлено» (0) или код причины недоставки (1 — адрес не найден, 2 — получатель отказался и т. д.).

Стандартные коды

Код Значение
0 Успешное выполнение
1 Общая ошибка
2 Неправильное использование команды (некорректные аргументы)
126 Файл найден, но не является исполняемым
127 Команда не найдена
128+N Процесс завершён сигналом N (например, 137 = 128 + 9 = SIGKILL)
130 Прервано по Ctrl+C (128 + 2 = SIGINT)

Проверка exit code

Пример
# $? — код возврата последней команды
ls /tmp
echo $?           # 0 (успех)

ls /nonexistent
echo $?           # 2 (ошибка)

# Использование в условиях (if проверяет exit code команды)
if grep -q "ERROR" app.log; then
    echo "Errors found!"
fi
# grep возвращает 0, если нашёл совпадение, и 1, если нет

# Логические операторы
command1 && command2       # command2 выполнится только если command1 вернула 0
command1 || command2       # command2 выполнится только если command1 НЕ вернула 0

# Практический пример
mvn clean package && echo "Build OK" || echo "Build FAILED"

set -e — прерывание при ошибке

Пример
#!/bin/bash
set -e           # Скрипт завершится при первой ошибке (exit code != 0)

echo "Step 1"
false            # exit code 1 → скрипт остановится здесь
echo "Step 2"   # Не выполнится

set -o pipefail — ошибки в пайпах

Пример
#!/bin/bash
# Без pipefail: exit code пайпа = exit code ПОСЛЕДНЕЙ команды
false | true
echo $?          # 0 (ошибка false потеряна!)

# С pipefail: exit code пайпа = код первой ошибочной команды
set -o pipefail
false | true
echo $?          # 1 (ошибка false обнаружена)

set -u — ошибка при неопределённых переменных

Пример
#!/bin/bash
set -u
echo $UNDEFINED_VAR   # Скрипт завершится с ошибкой вместо подстановки пустой строки

Рекомендуемый шаблон для скриптов

Пример
#!/bin/bash
set -euo pipefail    # Строгий режим: все три флага вместе

# -e  — остановка при ошибке
# -u  — ошибка при неопределённой переменной
# -o pipefail — ошибки в пайпах не игнорируются

Возврат exit code из скрипта

Пример
#!/bin/bash
if [ $# -eq 0 ]; then
    echo "No arguments provided" >&2    # Ошибки в stderr
    exit 1
fi

process_data "$1"
exit 0     # Явный успешный возврат (необязательно — по умолчанию код последней команды)

На собеседовании: ключевое — знать, что 0 = успех, не-0 = ошибка, и уметь объяснить set -euo pipefail. Частый вопрос: «процесс завершился с кодом 137 — что произошло?» — ответ: 128 + 9 = SIGKILL, процесс был принудительно убит (часто OOM Killer в Linux).