set -e -u -o pipefail
Тема дорожной карты · Bash
set -e (также записываемое как set -o errexit) предписывает Bash немедленно завершать работу, когда любая команда возвращает ненулевой статус завершения, предотвращая распространение скрытых сбоев через shell-скрипт и нанесение трудно отлаживаемого ущерба далее по потоку. set -u (также записываемое как set -o nounset) заставляет Bash считать ссылки на неопределённые переменные ошибкой, обнаруживая опечатки в именах переменных — частую и дорогостоящую ошибку в скриптах автоматизации Linux. Вместе с set -o pipefail комбинация set -euo pipefail, размещённая в начале каждого Bash-скрипта, является каноническим заклинанием защитного написания shell-скриптов, рекомендуемым практически каждым руководством по лучшим практикам. Существуют важные нюансы для set -e: оно не прерывает выполнение внутри условий (if cmd; then), в левой части && и ||, а также в последней команде функции, когда функция используется в условном контексте, поэтому понимание этих исключений необходимо. Совместное использование set -e и set -u — основополагающая практика написания Bash-скриптов для создания безопасных и предсказуемых инструментов автоматизации Linux и DevOps.
Как это работает
set -e -u -o pipefail: 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 -u -o pipefail: set -e не ловит сбои внутри if, ||, && или в subshell (правила тонкие — читайте manual); set -u валит на ${VAR:-default}-паттернах внутри массивов; trap, зовущий функцию, которая сама падает (cleanup-цикл).