Короткий ответ
set -e останавливает скрипт при первой команде с ненулевым кодом возврата, -u превращает обращение к неопределённой переменной в ошибку, а -o pipefail делает так, чтобы пайплайн из нескольких команд считался упавшим, если упала любая команда в цепочке, а не только последняя.
Как это работает подробнее
по умолчанию bash продолжает выполнение после неудачной команды и использует неопределённые переменные как пустые строки, а код возврата пайплайна cmd1 | cmd2 равен коду возврата только cmd2. Эти три флага меняют поведение на более строгое и предсказуемое.
Пример кода
example-471.sh
#!/usr/bin/env bash
set -euo pipefail
echo "Начинаем деплой"
false | echo "эта строка всё равно выполнится без pipefail"
echo "Эта строка не выполнится при pipefail, т.к. false вернула ошибку"Что использовать на практике
- Рекомендация. флаги стоит добавлять почти в каждый продакшен-скрипт, но помнить про исключения — например,
set -eне срабатывает внутри условий (if cmd; then) и внутри&&/||, поэтому проверку кода возврата важных шагов иногда нужно делать явно черезif ! deploy; then handle_error; fi.
Подводные камни
- Ошибка. добавлять флаги "для галочки", не проверяя, что скрипт действительно останавливается там, где нужно; забывать, что
pipefailне включён по умолчанию, и не замечать, чтоgrepв середине пайплайна "съедает" ошибку предыдущей команды.