Почему mkdir завершается ошибкой (такого файла или каталога нет) в сценарии с BIN_DIR = "~ / bin /"? - proUbuntu
Винтажный Клуб для гитаристов
10 голосов
/

Почему команда mkdir завершается с ошибкой: «Нет такого файла или каталога»?

#!/bin/bash

set -e

BIN_DIR="~/bin/"

if [ ! -d "$BIN_DIR" ]; then
  mkdir "$BIN_DIR"
fi

Ответы [ 2 ]

22 голосов
/

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

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

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

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

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

9 голосов
/

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

BIN_DIR=~/bin/

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

BIN_DIR="$HOME/bin/"

На мой взгляд, второй подход - лучшая практика.

Добро пожаловать на сайт proUbuntu, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...