В Bash часто добавляют set -e, чтобы скрипт завершался при ошибке команды.
set -e
Это лучше, чем полностью игнорировать exit code. Но есть важный нюанс. set -e работает не как полноценный try/catch и в некоторых конструкциях ведёт себя неочевидно.
Например, ошибка внутри условия может быть ожидаемой:
if grep -q "ready" app.log; then
echo "ready"
fi
Если grep ничего не нашёл, он вернёт 1. Для if это нормальная логика.
Похожая история бывает с командами, где ошибка должна быть обработана явно:
rm old.lock
start_service
Если файла нет, rm вернёт ошибку и скрипт может завершиться раньше, чем дойдёт до запуска сервиса.
Лучше писать намерение явно:
rm -f old.lock
start_service
Для обязательных шагов хорошо добавлять понятное сообщение:
curl --fail "$URL" -o app.tar.gz \
|| { echo "download failed"; exit 1; }
А для пайпов почти всегда нужен pipefail:
set -euo pipefail
Без pipefail скрипт может смотреть только на статус последней команды в pipeline и пропустить ошибку в начале цепочки.
Хорошая база для скриптов выглядит так:
set -euo pipefail
curl --fail "$URL" -o app.tar.gz
tar -xzf app.tar.gz
Команды, где ошибка допустима, лучше оформлять явно через if, || true, rm -f или отдельную обработку.
➡️ DevOps Ready | #совет