Очистка ресурсов
Тема дорожной карты · Bash
Команда trap в Bash регистрирует обработчик, который автоматически выполняется при получении оболочкой сигнала или завершении работы, что делает её стандартным механизмом очистки в shell-скриптах — например, trap 'rm -f "$tmpfile"' EXIT гарантирует удаление временного файла даже при досрочном завершении скрипта из-за ошибки. Встроенная команда trap поддерживает имена сигналов, такие как INT, TERM, HUP, и псевдосигналы EXIT и ERR, поэтому Bash-скрипты могут освобождать блокировки, размонтировать файловые системы или отправлять уведомления о сбоях при неожиданной остановке. Рекомендуемая практика написания Linux shell-скриптов — настраивать ловушку очистки заблаговременно, как правило, сразу после объявления имён временных файлов, чтобы выходы по set -e всё равно запускали обработчик. Обработчик trap ERR срабатывает каждый раз, когда команда возвращает ненулевой код завершения (при активном set -e), что позволяет скриптам автоматизации Bash регистрировать сбойную команду, освобождать ресурсы и корректно завершать работу вместо того, чтобы оставлять систему в частично изменённом состоянии. Сочетание trap, set -euo pipefail и хорошо именованных временных файлов создаёт shell-скрипты, надёжно работающие в производственных средах 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-цикл).