Обработка ошибок
Тема дорожной карты · Bash
Обработка ошибок в Bash начинается с set -euo pipefail в начале каждого скрипта автоматизации: set -e приводит к немедленному завершению оболочки, когда любая команда возвращает ненулевой код завершения; set -u считает ссылки на неустановленные переменные ошибками; а set -o pipefail обеспечивает сбой конвейера при отказе любой его команды, а не только последней. Механизм trap ERR в Bash запускает функцию-обработчик каждый раз, когда команда завершается с ошибкой, позволяя shell-скриптам регистрировать ошибку, освобождать ресурсы и завершаться с понятным сообщением вместо того, чтобы молча продолжать работу в неисправном состоянии. Явная проверка ошибок с помощью if ! command; then echo "error" >&2; exit 1; fi даёт более точный контроль, чем set -e, для команд, отказы которых следует обрабатывать, а не считать фатальными, и является рекомендуемой практикой для нетривиальных путей обработки ошибок в скриптах автоматизации Linux. Переменная $? содержит код завершения последней команды, а шаблоны вроде result=$(cmd) || { echo "cmd failed" >&2; exit 1; } объединяют подстановку команды с встроенной обработкой ошибок в командной строке. Надёжная обработка ошибок в shell-скриптах Bash — это то, что отличает производственную автоматизацию Linux от хрупких одноразовых скриптов, оставляющих системы в непоследовательных состояниях.
Как это работает
Обработка ошибок: 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-цикл).
Связанные понятия
Полезные ресурсы
Проверить знания (2)
Загрузка вопросов…