Коды выхода
Тема дорожной карты · Bash
Коды завершения в Bash — это целочисленные значения от 0 до 255, возвращаемые каждой командой и скриптом: значение 0 означает успех, а любое ненулевое — наиболее часто 1 для общих ошибок и 2 для неправильного использования встроенных команд оболочки — означает сбой; последний код завершения всегда доступен через $?. Shell-скрипты всегда должны завершаться явным exit 0 при успехе и конкретным ненулевым exit 1 (или выше) при сбое, что позволяет вызывающему коду и инструментам оркестрации обнаруживать сбои в конвейерах автоматизации Linux. Переменная $? устанавливается после каждой команды, поэтому проверка [[ $? -ne 0 ]] сразу после команды или использование if command; then ...; fi является стандартным шаблоном обработки ошибок в Bash-скриптах. Некоторые коды завершения имеют общепринятые значения в Linux: 126 означает, что команда найдена, но не является исполняемой; 127 — команда не найдена; 128+n — скрипт был завершён сигналом n — эти знания необходимы для диагностики сбоев в скриптах автоматизации. Использование чётко определённых кодов завершения в Bash-скриптах делает их компонуемыми в конвейерах, надёжными в заданиях cron и понятными для систем мониторинга, проверяющих статус завершения процессов в командной строке.
Как это работает
Коды выхода: set -e (выход на ошибке), set -u (ошибка на undefined-переменной), set -o pipefail (пайп валится, если любая стадия упала), часто комбинируют: set -euo pipefail. trap "cleanup" EXIT — cleanup на выход скрипта; trap "..." ERR — на ошибку. command || handler для восстановления. Захват exit-кода: if ! cmd; then ...; fi или cmd; rc=$?. Никогда не доверяйте дефолтной обработке ошибок — она тихо продолжает.
Когда применять
Каждый скрипт начинайте с set -euo pipefail + IFS=$'\n\t'. Trap для cleanup временных файлов (trap "rm -f $tmp" EXIT). Для команд, которые могут легитимно упасть, suppress через cmd || true. Всегда валидируйте input сверху — громко падайте, если required env var отсутствует.
Типичные ошибки
Ловушки Коды выхода: set -e не ловит сбои внутри if, ||, && или в subshell (правила тонкие — читайте manual); set -u валит на ${VAR:-default}-паттернах внутри массивов; trap, зовущий функцию, которая сама падает (cleanup-цикл).