Это не работает:
$ ls "~/.wine/drive_c/tools/Family Tree v2.0"
ls: cannot access '~/.wine/drive_c/tools/Family Tree v2.0': No such file or directory
Но это так:
$ ls "/home/daniel/.wine/drive_c/tools/Family Tree v2.0"
Dossiers Dossiers_orig Infos.opt Racines.exe 'Register OCX.bat' racines.CNT
Dossiers-2019.11.03-11.46.tar.gz Html REGSVR32.exe Racines.hlp Uninst.isu readme.txt
Учитывая, что это ~
должно быть то же самое /home/daniel
, что и , что здесь происходит?
решение1
Кавычки, даже двойные, подавляют расширение тильды.
~
может быть использованкак путь к вашему домашнему каталогув контекстах, гдерасширение тильдывыполняется. ~
не похоже.
или..
. На самом деле в вашей файловой системе нет записей, ~
которые бы служили альтернативными именами для вашего домашнего каталога.
Когда ~
появляется сам по себе или как первый компонент пути, ваша оболочка расширяет его вабсолютный путьв ваш домашний каталог. Но этого не происходит, когда ~
цитируется.Двойные кавычкиобеспечивают более слабую формуцитированиечемодинарные кавычки, что важно для некоторых других видоврасширение, такой какрасширение параметра(который расширяется $HOME
). Но даже двойные кавычки подавляют расширение тильды.
Таким образом ~
, в этой команде это не было раскрыто, хотя и цитируется:
ls "~/.wine/drive_c/tools/Family Tree v2.0"
К счастью, разрешено писать аргумент, некоторые части которого цитируются, а некоторые — нет. Так что вы можете поставить ~/
перед кавычками, и все равно цитировать остальное:
ls ~/".wine/drive_c/tools/Family Tree v2.0"
Или, поскольку расширение параметров выполняется даже в двойных кавычках (но не в одинарных), вы можете использовать:
ls "$HOME/.wine/drive_c/tools/Family Tree v2.0"
(Технически это отличается тем, что даже если HOME
переменная окружения не установлена, некоторые оболочки все равно пытаются выяснить, какой у вас домашний каталог, и расшириться ~
до него, и bash
это одна из таких оболочек. Но это случается редко и нецелесообразно отменять HOME
установку.)
Дальнейшее чтение: