Почему делает mkdir, управляют сбоем с: "Никакой такой файл или каталог"?
#!/bin/bash
set -e
BIN_DIR="~/bin/"
if [ ! -d "$BIN_DIR" ]; then
mkdir "$BIN_DIR"
fi
Сообщение об ошибке производится потому что тильда ~
заключается в кавычки, как описано в ответе Zanna. Если Вы хотите использовать ~
, соответствующая часть сценария должна быть:
BIN_DIR=~/bin/
Если по любой причине Вы хотите заключить строку в кавычки, можно использовать переменную среды $HOME
:
BIN_DIR="$HOME/bin/"
По-моему, второй подход является лучшей практикой.
Это не работает потому что ~
заключается в кавычки. Двойные кавычки "
подавите расширение тильды. Нет никакого каталога с литеральным именем ~/bin
. Как объяснено в man bash
(шахта акцента):
Расширение тильды
Если слово начинается с неупомянутого символа тильды (' ~ '), все символы, предшествующие первой неупомянутой наклонной черте (или все символы, если нет никакой неупомянутой наклонной черты), считаются префиксом тильды. Если ни один из символов в префиксе тильды не заключается в кавычки, символы в префиксе тильды после тильды рассматривают как возможное имя для входа в систему. Если это имя для входа в систему является пустой строкой, тильда заменяется значением параметра оболочки ДОМОЙ. Если ДОМОЙ сброшен, корневым каталогом пользователя, выполняющего оболочку, заменяют вместо этого. Иначе префикс тильды заменяется корневым каталогом, связанным с указанным именем для входа в систему.
Можно удалить кавычки с тех пор ~
единственный символ в пути ~/bin
это заставит оболочку выполнять расширение, и мы хотим расширение в этом случае. Оболочка не выполнит дальнейшие расширения на результате расширения тильды, по крайней мере, в Bash 4, который имеют все текущие или удаленно недавние релизы Ubuntu. Таким образом, даже если Ваш корневой каталог содержит необычные символы как пробелы, это хорошо.
Или можно использовать $HOME
вместо ~
, потому что расширение параметра не подавлено двойными кавычками, только одинарными кавычками. Двойные кавычки действительно гарантируют, что расширенное значение самостоятельно не подвергается дальнейшим расширениям, таким образом, разделение слова или расширение имени файла не произойдут. Так $HOME
работы даже со странно именованными корневыми каталогами также, пока Вы сохраняете двойные кавычки.