Написание моего первого сценария, так что я уверен, что это основной вопрос, но может кто-нибудь объяснить мне, почему я могу:
cd ~
cd bin
cd ~/bin
cd 'bin'
Но нет
cd '~'
cd '~/bin'
Мне нужно cd
указать путь к каталогу с пробелом в одном из имен каталогов, поэтому мне нужны кавычки (это винда Program Files
под вином). Я могу обойти это с помощью двух cd
команд, но почему я не могу поставить ~
в кавычки?
Если я наберу cd '~'
(или cd "~"
) я получу:
bash: cd: ~: No such file or directory
command-line
bash
B.Tanner
источник
источник
cd
попали в каталог с именем~
?cd
. Используйте переменные для хранения путей, которые вы не хотите вводить несколько раз, напримерpf=~/.wine/drive_c/Program\ Files/; cp /path/to/file "$pf"
/
илиNUL
?cd ./~
Ответы:
Как отметил @karel в своем ответе,
~
это специальный символ, который Bash расширил до домашнего каталога текущего пользователя. См . Руководство Bash по «Расширению тильды» или поищите заголовок «Расширение тильды» на странице руководства (man bash
).Любая цитата вокруг этого
~
препятствует расширению тильды.Чтобы ответить на ваш вопрос о том, как вы все еще можете использовать его
cd
в каталоге с пробелами в его имени, есть несколько альтернатив:Опустите кавычки и вместо них используйте пробелы с обратной косой чертой:
Процитируйте оставшуюся часть пути, но опустите их вокруг тильды и первой косой черты:
Как видите, вы можете объединять строки в кавычках и без кавычек в Bash, просто записывая их рядом друг с другом без пробелов между ними.
Используйте переменную окружения
$HOME
вместо тильды, которая все еще раскрывается внутри «двойных кавычек» (но не «одинарных кавычек»):источник
~'/...'
не сработает и не соответствует этому ответу.~/'...'
или~/"..."
будет работать.~/'path'
это путь~'/...'
работать? Косая черта не является специальным символом, поэтому, похоже, она должна работать внутри или вне кавычек.~ - это специальный символ, который интерпретируется оболочкой как домашний каталог зарегистрированного пользователя. '~' интерпретируется оболочкой как буквальный символ ~, а не как домашний каталог пользователя, вошедшего в систему, поскольку при заключении строки в два символа одинарных кавычек эта строка интерпретируется как текстовая строка.
источник
~
не является псевдонимом в том смысле, в какомbash
его интерпретируют: псевдонимы позволяют заменить слово строкой, когда оно используется в качестве первого слова простой команды. , Как я объясняю в своем ответе ниже, это скорее расширение.Эта
bash
функция называется расширением Тильды . Ссылаясь наman bash
:Чтобы раскрытие работало, символ тильды
~
должен быть заключен в кавычки, иначе символ воспринимается буквально иcd
завершается неудачей, если~
в текущем каталоге нет имени с именем . Смотрите этот интенсивный ответ для объяснения цитирования вbash
. Если вам нужно процитировать часть пути, вы можете:цитируйте как минимум символы, которые нужно заключать в одинарные кавычки, например
или
цитируйте как минимум символы, которые нужно заключить в двойные кавычки, например
или
цитируйте только те символы, которые нужно заключить в кавычки, например
Расширение Tilde имеет еще несколько интересных функций, например:
~+
расширяется до значенияPWD
, т.е. текущего рабочего каталога~-
расширяется до значенияOLDPWD
, т.е. предыдущего рабочего каталога~john
расширяется до домашнего каталога, связанного с логином «Джон»источник
$ touch a; cd \a
. (Я думал, что это может столкнуться с проблемамиcd \n
, но эксперименты, по крайней мере, с моей версией,bash
предполагают, что это работает нормально.)Исследуйте используя
echo
командуСамый простой способ изучения того, как все работает в bash, - это
echo
команда. В случае~
использования это:Как вы можете видеть, когда вы
~
заключаете в одинарные кавычки или используете двойные кавычки, они интерпретируются буквально как строка, а не как переменная. Когда вы используете backticks (`), он выполняется как команда и генерирует сообщение об ошибке.источник