Почему mkdir перестал работать (никакой такой файл или каталог) в сценарии с BIN_DIR = “~ / мусорное ведро /”?

Почему делает mkdir, управляют сбоем с: "Никакой такой файл или каталог"?

#!/bin/bash

set -e

BIN_DIR="~/bin/"

if [ ! -d "$BIN_DIR" ]; then
  mkdir "$BIN_DIR"
fi
10
задан 17 November 2017 в 05:48

2 ответа

Сообщение об ошибке производится потому что тильда ~ заключается в кавычки, как описано в ответе Zanna. Если Вы хотите использовать ~, соответствующая часть сценария должна быть:

BIN_DIR=~/bin/

Если по любой причине Вы хотите заключить строку в кавычки, можно использовать переменную среды $HOME:

BIN_DIR="$HOME/bin/"

По-моему, второй подход является лучшей практикой.

10
ответ дан 23 November 2019 в 04:17

Это не работает потому что ~ заключается в кавычки. Двойные кавычки " подавите расширение тильды. Нет никакого каталога с литеральным именем ~/bin. Как объяснено в man bash (шахта акцента):

Расширение тильды

Если слово начинается с неупомянутого символа тильды (' ~ '), все символы, предшествующие первой неупомянутой наклонной черте (или все символы, если нет никакой неупомянутой наклонной черты), считаются префиксом тильды. Если ни один из символов в префиксе тильды не заключается в кавычки, символы в префиксе тильды после тильды рассматривают как возможное имя для входа в систему. Если это имя для входа в систему является пустой строкой, тильда заменяется значением параметра оболочки ДОМОЙ. Если ДОМОЙ сброшен, корневым каталогом пользователя, выполняющего оболочку, заменяют вместо этого. Иначе префикс тильды заменяется корневым каталогом, связанным с указанным именем для входа в систему.

Можно удалить кавычки с тех пор ~ единственный символ в пути ~/bin это заставит оболочку выполнять расширение, и мы хотим расширение в этом случае. Оболочка не выполнит дальнейшие расширения на результате расширения тильды, по крайней мере, в Bash 4, который имеют все текущие или удаленно недавние релизы Ubuntu. Таким образом, даже если Ваш корневой каталог содержит необычные символы как пробелы, это хорошо.

Или можно использовать $HOME вместо ~, потому что расширение параметра не подавлено двойными кавычками, только одинарными кавычками. Двойные кавычки действительно гарантируют, что расширенное значение самостоятельно не подвергается дальнейшим расширениям, таким образом, разделение слова или расширение имени файла не произойдут. Так $HOME работы даже со странно именованными корневыми каталогами также, пока Вы сохраняете двойные кавычки.

23
ответ дан 23 November 2019 в 04:17

Другие вопросы по тегам:

Похожие вопросы: