Надёжный bash-скрипт
Вопрос
Тебе нужно написать скрипт деплоя на bash. Какие приёмы сделают его надёжным?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
`set -euo pipefail` в начале и понимание его исключений
Все переменные в двойных кавычках, `${VAR:?}` для обязательных
`trap ... EXIT` для уборки, временные файлы через `mktemp`
Проверка `cd ... || exit`, абсолютные пути или переход в каталог скрипта
Идемпотентность: повторный запуск не ломает систему
shellcheck в CI, логирование в stderr, понятные коды выхода
Что могут спросить следом
- Как сделать, чтобы два деплоя не запустились одновременно?
- Когда bash уже не подходит и пора брать Python или Go?
- Как передать секрет в скрипт, не светя его в
ps?
Разбор
В начале set -euo pipefail, при этом помню, что -e не срабатывает в условиях и маскируется local x=$(cmd), поэтому важные шаги проверяю явно. Все переменные в двойных кавычках, обязательные параметры через ${VAR:?нужен VAR}. Временные файлы только через mktemp, уборка в trap '...' EXIT. Перед опасными командами проверяю cd ... || exit 1, а каталог скрипта беру через $(dirname "$0"), а не надеюсь на текущий. Скрипт делаю идемпотентным: mkdir -p, проверка перед созданием, атомарное переключение симлинка. Чтобы не было параллельных запусков, беру блокировку flock. Логи в stderr с временем, коды выхода осмысленные. И обязательно shellcheck в CI: он ловит большую часть ловушек. Когда появляется сложная логика, JSON или больше пары сотен строк, честнее перейти на Python или Go.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.