Почему я не могу перейти на цитируемую тильду ('~')?

Написание моего первого сценария, так что я уверен, что это основной вопрос, но может кто-нибудь, пожалуйста, объясните мне, почему я могу:

cd ~
cd bin
cd ~/bin
cd 'bin'

Но не

cd '~'
cd '~/bin'

I Мне нужно cd указать путь к каталогу с пробелом в одном из имен каталогов, поэтому мне нужны кавычки (это Windows Program Files под Wine). Я могу обойти это с помощью двух cd команд, но почему я не могу поставить ~ в кавычки?

Если я наберу cd '~' (или cd "~"), я получу:

bash: cd: ~: No such file or directory
36
задан 5 May 2018 в 17:36

4 ответа

Как отметил @karel в своем ответе, ~ - это специальный символ, расширяемый Bash в домашний каталог текущего пользователя. См. руководство Bash по «Расширению тильды» или найдите заголовок «Расширение тильды» на странице руководства ( man bash ).

Любые цитаты вокруг ] ~ предотвращает это расширение тильды.


Чтобы ответить на ваш вопрос о том, как вы все еще можете использовать его, cd в каталог с пробелами в его имени, есть несколько альтернатив:

  • Опускайте кавычки и экранируйте пробелы с помощью обратной косой черты:

     cd ~ / foo / space \ are \ cool / bar
     
  • Процитируйте оставшуюся часть пути, но опустите их вокруг тильды и первой косой черты:

     cd ~ / "foo / space are cool / bar"
     

    Как видите, вы можете объединить строки в кавычках и без кавычек в Bash, просто написав их рядом друг с другом без пробелов между ними.

  • Используйте переменную среды $ HOME вместо тильды, который по-прежнему раскрывается внутри «двойных кавычек» (но не «одинарных кавычек»):

     cd «$ HOME / foo / space are cool / bar»
     
80
ответ дан 23 November 2019 в 00:35

~ - это специальный символ, который интерпретируется оболочкой как домашняя страница вошедшего в систему пользователя. каталог. '~' интерпретируется оболочкой как буквальный символ ~, а не как домашний каталог пользователя, вошедшего в систему, потому что включение строки внутри двух символов одинарных кавычек приводит к тому, что эта строка интерпретируется как буквальная текстовая строка.

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

Это функция bash под названием Расширение тильды . Ссылаясь на man bash :

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

Чтобы расширение работало, символ тильды ~ не должен заключаться в кавычки, иначе символ воспринимается буквально и cd не выполняется, если в текущем каталоге нет каталога с именем ~ . См. этот подробный ответ для объяснения цитирования в bash . Если вам нужно заключить часть пути в кавычки, вы можете:

  1. указать как минимум символы, которые нужно указывать в одинарных кавычках, например,

     ~ / dir '' с '' пробелами /
     

    или

     ~ / 'dir с пробелами /'
     
  2. укажите как минимум символы, которые необходимо заключить в двойные кавычки, например

     ~ / dir "" с пробелами "" /
     

    или

     ~ / "каталог с пробелами /"
     
  3. заключайте в кавычки только символы, которые нужно заключать в кавычки, с обратной косой чертой, например

     ~ / dir \ with \ пробелы /
     

Расширение тильды имеет несколько более интересных функций, например:

  • ~ + расширяется до значения PWD , то есть текущий рабочий каталог
  • ~ - расширяется до значение OLDPWD , то есть предыдущий рабочий каталог
  • ~ john расширяется до домашнего каталога, связанного с именем входа «john»
16
ответ дан 23 November 2019 в 00:35

Изучите с помощью команды echo

Самый простой способ изучить, как все работает в bash, можно с помощью команды echo . В случае ~ используйте следующее:

$ echo ~
/home/rick
$ echo '~'
~
$ echo "~"
~
$ echo `~`
bash: /home/rick: Is a directory

Как видите, когда вы используете одинарные или двойные кавычки вокруг ~ , это интерпретируется буквально как строка, а не раскрывается как переменная. Когда вы используете обратные кавычки (`), он выполняется как команда и генерирует сообщение об ошибке.

2
ответ дан 23 November 2019 в 00:35

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

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