Практическое задание

Эта задача — шаг 29 курса «Bash-скрипты: от цикла до надёжного скрипта»

Публикация не замечает ошибку

средне~7 мин

Скрипт /root/publish.sh читает версию из /srv/build/version.txt, упаковывает сайт и пишет /root/published.txt. Файла с версией сейчас нет — и скрипт всё равно рапортует об успехе. Включи в нём строгий режим set -euo pipefail, чтобы при такой ошибке скрипт останавливался и /root/published.txt не появлялся. Когда версия на месте, публикация должна проходить как раньше.

Что потренируешь:
  • set -euo pipefail
  • pipefail
  • строгий режим
  • коды возврата
  • fail-fast

Разбор темы

По умолчанию bash не останавливается на ошибках, а код возврата конвейера — это код его последней команды. Поэтому cat нет-файла | tr … «успешен»: cat упал, но tr спокойно обработал пустой ввод. set -e прерывает скрипт на первой неудачной команде, однако упавшее звено в середине конвейера он не видит — для этого нужен set -o pipefail, после которого конвейер возвращает ошибку любого звена. set -u добавляет ещё одну страховку: опечатка в имени переменной становится ошибкой, а не пустой строкой. Вместе это «строгий режим» — стандартная преамбула скриптов, которые что-то публикуют или деплоят.

Что проверяется

  1. строгий режим включён
  2. без файла версии скрипт останавливается
  3. с файлом версии публикация проходит

Как это выглядит