Итак, я удалил свою домашнюю папку (или, точнее, все файлы, к которым у меня был доступ для записи). Что случилось то, что у меня было
build="build"
...
rm -rf "${build}/"*
...
<do other things with $build>
в bash-скрипте и, после того, как больше не нужно $build, удалить объявление и все его использования - кроме rm. Баш радостно расширяется rm -rf /*. Да.
Я почувствовал себя глупо, установил резервную копию, переделал потерянную работу. Пытаясь пройти мимо позора.
Теперь я задаюсь вопросом: каковы методы написания сценариев bash, чтобы такие ошибки не возникали или, по крайней мере, менее вероятны? Например, если бы я написал
FileUtils.rm_rf("#{build}/*")
в сценарии на Ruby переводчик жаловался на то, что его buildне объявили, поэтому язык защищает меня.
То, что я рассмотрел в bash, помимо загона rm(что, как упоминают многие ответы в смежных вопросах, не является проблемой):
rm -rf "./${build}/"*
Это убило бы мою текущую работу (репозиторий Git), но ничего больше.- Вариант / параметризация
rmэтого требует взаимодействия при работе вне текущего каталога. (Не удалось найти.) Подобный эффект.
Это так или есть другие способы написания bash-скриптов, которые в этом смысле «надежны»?
set -uне так хмурится, как set -eесть, но у него все еще есть свои ошибки.
#! /usr/bin/env rubyв начало каждого сценария оболочки и забудьте о bash;)
rm -rf "${build}/*независимо от того, куда идут кавычки.rm -rf "${build}будет делать то же самое из-заf.