Зачем писать `set -e` в начале bash-скрипта?

«Зачем писать `set -e` в начале bash-скрипта?» — вопрос из категории Скриптинг и автоматизация, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Директива set -e (или set -o errexit) предписывает оболочке немедленно завершить выполнение скрипта, если любая команда завершится с ненулевым статусом (т.е. с ошибкой). Это критически важно для скриптов автоматизации в DevOps, чтобы предотвратить выполнение последующих команд в некорректном состоянии системы.

Пример:

#!/bin/bash
set -e  # Скрипт завершится на первой же ошибке

# Если эта команда упадет, скрипт остановится, и деплой не начнется
terraform apply -auto-approve

# Эта строка не выполнится в случае ошибки выше
ansible-playbook deploy.yml

Важные нюансы:

  • set -e не срабатывает для команд в конвейерах (например, cmd1 | cmd2), если только не установлен также set -o pipefail.
  • Ошибки в условиях (например, в if или while) игнорируются.
  • Её можно временно отключить для блока кода: set +e ... set -e.

В продакшн-скриптах я обычно комбинирую set -euo pipefail для строгого режима: выход при ошибках, неопределённых переменных и ошибках в конвейерах.