Почему mkdir сбой (нет такого файла или каталога) в скрипте с BIN_DIR = & ldquo; ~ / bin / & rdquo ;?

Мое решение состояло в создании символической ссылки в / lib / cpp, которая указывает на gcc.

ln -sv "$(which gcc)" /lib/cpp

10
задан 17 November 2017 в 16:48

6 ответов

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

BIN_DIR=~/bin/

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

BIN_DIR="$HOME/bin/"

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

9
ответ дан 22 May 2018 в 16:09
  • 1
    Нет ничего плохого в использовании скриптов ~. он работает точно так же, как в командной строке. Проблема заключается в том, что цитирование блокирует расширение тильды, как объяснено в ответе Занны . – terdon♦ 17 November 2017 в 14:44
  • 2
    @terdon, я согласен. Но я не сказал, что что-то не так, но это лучшая идея, потому что вы должны уделять меньше внимания. – pa4080 17 November 2017 в 14:59
  • 3
    Но здесь нет никакой разницы между командной строкой и скриптом. Тот факт, что это в скрипте, совершенно не имеет значения, у вас будет точно такая же ошибка в командной строке. Проблема заключается в цитировании, а не в сценарии. – terdon♦ 17 November 2017 в 15:06
  • 4
    Хотя это абсолютно верно, также правильно, что использование скриптов $HOME - хорошая идея. – dessert 17 November 2017 в 15:42
  • 5
    @ pa4080 Можете ли вы добавить объяснение , почему вы думаете, что лучше расширить $HOME, чем использовать расширение тильды? Единственное объяснение, которое вы дали, это сказать: «Это лучшая идея, потому что вы должны уделять меньше внимания». Я понятия не имею, что это значит. Можете ли вы изложить его в редактировании? Без этого нет ничего, поддерживающего ваш ответ, так что, конечно, оно принадлежит ему. Расширение Тильды потребовалось POSIX для уже довольно давно и , строка hashbang скрипта #!/bin/bash, поэтому я полагаю, что переносимость не является причиной. – Eliah Kagan 17 November 2017 в 16:45

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

BIN_DIR=~/bin/

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

BIN_DIR="$HOME/bin/"

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

9
ответ дан 18 July 2018 в 03:08

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

BIN_DIR=~/bin/

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

BIN_DIR="$HOME/bin/"

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

9
ответ дан 24 July 2018 в 17:45

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

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

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

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

22
ответ дан 22 May 2018 в 16:09
  • 1
    Согласно этому утверждению расширение параметра не подавляется двойными кавычками, только одинарными кавычками «: выход cd '~' равен -bash: cd: ~: No such file or directory. – pa4080 17 November 2017 в 20:24
  • 2
    @ pa4080. Расширение ~ не является частью расширения параметров. – Barmar 17 November 2017 в 21:24

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

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

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

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

22
ответ дан 18 July 2018 в 03:08

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

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

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

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

22
ответ дан 24 July 2018 в 17:45
  • 1
    Согласно этому утверждению расширение параметра не подавляется двойными кавычками, только одинарными кавычками «: выход cd '~' равен -bash: cd: ~: No such file or directory. – pa4080 17 November 2017 в 20:24
  • 2
    @ pa4080. Расширение ~ не является частью расширения параметров. – Barmar 17 November 2017 в 21:24

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

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