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