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).