Выбор ответа Senior Bash-скрипты обновлено

Опасная пара cd и rm

Вопрос

Почему строка cd "$BUILD_DIR"; rm -rf * в скрипте без set -e считается опасной?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Если cd не удался, rm удалит всё в текущем каталоге. Без проверки результата cd следующая команда выполнится в том каталоге, где скрипт оказался: в исходном или, при пустой переменной, в $HOME.

Варианты ответа

  1. rm -rf * не удаляет скрытые файлы, и сборка останется грязной
  2. Если cd не удался, rm удалит всё в текущем каталогеправильный ответ
  3. Точка с запятой запускает команды параллельно, rm опередит cd
  4. * не раскрывается после ;, и rm получит буквальную звёздочку

Разбор

Без проверки результата cd следующая команда выполнится в том каталоге, где скрипт оказался: в исходном или, при пустой переменной, в $HOME. Правильно cd "$BUILD_DIR" || exit 1 или rm -rf -- "${BUILD_DIR:?}"/*, где :? прервёт скрипт при пустой переменной. То, что * не захватывает скрытые файлы, правда, но опасность не в этом. ; выполняет команды последовательно.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.