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