trap ERR
Тема дорожной карты · Bash
Встроенная команда trap с псевдо-сигналом ERR позволяет зарегистрировать функцию-обработчик, которая автоматически запускается каждый раз, когда команда в Bash-скрипте возвращает ненулевой код завершения. Это обеспечивает централизованную обработку ошибок без необходимости проверять $? после каждой отдельной команды. Шаблон trap 'echo "Error on line $LINENO" >&2; exit 1' ERR широко используется, но более надёжной практикой является определение специализированной функции-обработчика ошибок и её регистрация через trap error_handler ERR в начале скрипта вместе с set -euo pipefail. Такое использование позволяет не только уведомлять о сбоях, но и обеспечивать гарантированную очистку ресурсов при завершении работы скрипта.
Ловушка ERR наследуется дочерними процессами, когда активен set -E (errtrace); без -E ловушка срабатывает только в контексте скрипта верхнего уровня. Это тонкое поведение Bash, которое должен понимать каждый автор скриптов автоматизации Linux. Сочетание trap cleanup EXIT с trap error_handler ERR обеспечивает как гарантированную очистку при выходе, так и немедленное уведомление о сбоях — два взаимодополняющих механизма обработки ошибок Bash. Освоение trap ERR вместе с set -e и $LINENO необходимо для написания производственных Bash-скриптов, которые явно и корректно завершаются при сбое на Linux.
Как это работает
trap ERR: 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 отсутствует.
Типичные ошибки
Ловушки trap ERR: set -e не ловит сбои внутри if, ||, && или в subshell (правила тонкие — читайте manual); set -u валит на ${VAR:-default}-паттернах внутри массивов; trap, зовущий функцию, которая сама падает (cleanup-цикл).