Иногда я использую, $PROJECT_HOME/*
чтобы удалить все файлы в проекте. Когда переменная окружения PROJECT_HOME
не установлена (потому что я сделал, su
а у нового пользователя не установлена эта переменная окружения), он начинает удалять все файлы из корневой папки. Это апокалипсис.
Как я могу настроить, bash
чтобы выдавать ошибку, когда я использую неопределенную переменную среды в оболочке?
bash
shell
environment-variables
Сообщество
источник
источник
set -u
будет делать то, что вы хотите.[ -z "$VAR" ]
работает с неинициализированнымVAR
тоже. Инициализация была просто для того, чтобы показать нежелательное поведение. Моя точка зрения заключается в том, что если ваши переменные когда-либо инициализируются пустыми строками, и выrm -r "$PROJECT_HOME"/*
ошибочно полагаетесь на нихset -u
, вы получите «апокалиптическое» поведение. IHMO, лучше быть в безопасности, чем сожалеть о защите всего содержимого вашего компьютера.set -u
не безопасноPROJECT_HOME=/etc
? Просто проверка на пустое значение недостаточно для предотвращения катаклизма. Вы не должны использовать переменные от ненадежных пользователей при запуске от имени пользователя root.Ответы:
В оболочке POSIX вы можете использовать set -u :
или используя расширение параметра :
В вашем случае вы должны использовать
:?
вместо того,?
чтобы также потерпеть неудачу на множественных, но пустых переменных:источник
Это также будет ловить случай , когда
PROJECT_HOME
будет установлен , но не содержит ничего.Пример:
1) Это удалит почти все, что вы можете удалить в своей системе (за исключением файлов точек
/
(обычно их нет)):2) Это ничего не сделает:
Полное удаление вашего проекта из дома и воссоздание его может быть другой вариант (если вы хотите избавиться и от dotfiles):
источник
-z
is ok, but since$PROJECT_HOME
is supposed to be a directory, maybe-d
would be better.[[ -d $PROJECT_HOME ]] && rm -r "$PROJECT_HOME"
.-d
Проверка будет скрыть эту ошибку. Я думаю, что было бы лучше, если бы он продолжалrm
иrm
жаловался на это вслух.[[ -d $PROJECT_HOME ]] && rm -r "$PROJECT_HOME"
ничего не будет делать, молча. Но[[ -z $PROJECT_HOME ]] || rm -r "$PROJECT_HOME"
молча удалит «$ PROJECT_HOME», даже если это файл, который не является каталогом. Получение сообщения об ошибке никогда не является проблемой:if [[ -d $PROJECT_HOME ]]; then rm -r "$PROJECT_HOME"; else printf '%s is not a directory\n' "$PROJECT_HOME" >&2; fi
PROJECT_HOME="/."
...Еще один способ сделать это:
Существует множество подстановок переменных, одна из которых выше, когда "somevar" пусто (и в этом случае он пытается удалить
/tmp/or_this_if_somevar_is_empty/*
)источник
rm -fr ${ENV_VAR:?suitably caustic message here}/*
, но он все еще может быть стоит проверить , что значение не отображает в корневой каталог, отметив , что есть много способов , чтобы ниспровергать простых тестов://
,/..
,/usr/who/../..
, ...