У меня есть папка с именем ~kernel-ppa
внутри ~/Downloads
.
aditya@aditya-desktop:~$ cd Downloads/
aditya@aditya-desktop:~/Downloads$ ls
~kernel-ppa
Теперь, когда я печатаю cd ~k
и нажимаю Tabдля автоматического расширения, оболочка расширяет его, cd ~kernoops/
вместо того, чтобы, cd ~kernel-ppa/
хотя папка с такими же начальными символами уже присутствовала.
Чтобы автоматическое расширение работало, мне нужно его избежать \
. Таким образом, использование cd \~k
и нажатие Tabправильно расширяет его до cd \~kernel-ppa/
. Даже использование cd \
и нажатие Tabделает свое дело.
Почему так и зачем мне бежать? Кроме того, что я избегаю, так как даже ~
не требуется для автоматического расширения?
Если я пойду с потоком, бегу cd ~kernoops/
и нажму Enter, статус терминала изменится на //
:
aditya@aditya-desktop:~/Downloads$ cd ~kernoops/
aditya@aditya-desktop://$ pwd
//
aditya@aditya-desktop://$ ls
bin cdrom etc initrd.img lost+found mnt proc run srv tmp var
boot dev home lib media opt root sbin sys usr vmlinuz
aditya@aditya-desktop://$
Это похоже на /
каталог, но pwd
говорит, что это так //
. Что именно это?
источник
tree
или с,ls
и вы заметите, что это первая подпапка.~kernel-ppa
это единственная папка внутри него; если я просто запускаюcd
и нажимаю вкладку, он расширяется доcd \~kernel-ppa/
. Мне тоже не нужно убегать!Ответы:
Как известно,
~
расширяется до вашего домашнего каталога. Но то, что вы, кажется, упустили, это то, что он~john
расширяется до домашнего каталога пользователя с именем "john".Проверьте ваш
/etc/passwd
файл:У него есть имя «системный пользователь»
kernoops
(по причинам, связанным с внутренней отчетностью об ошибках). Поэтому, когда выcd ~k
Tabнабираете текст, оболочка отдает предпочтение (1) расширению имени пользователя перед расширением локальных каталогов, и вы это делаетеcd ~kernoops
. Теперь это приводит к тому, что домашний каталог пользователя "kernoops" есть/
, так что онcd
к нему.В моей оболочке
zsh
у меня нет двойной косой черты (2):Кроме того, это имя каталога плохо продумано. Это потребует тройной заботы в сценариях и так далее. Единственная худшая идея, которую я могу подумать, - это вставить вкладку в нее ...
Примечания:
(1)
zsh
даже если у меня есть каталог с именем~xdir
и нет пользователя, начинающегося сx
; выполнениеcd ~x
Tabне расширяется и не цитирует~
ошибку:(2) Кажется, я помню, что posix сделал исключение для инициала
//
в пути - его следует поддерживать, потому что какой-то старый вариант Unix (я использовал apollos с Domain / OS, у которого это было), использовался//machine-name/...
для бесшовного доступа к другим машинам » файловая система в локальной сети (безопасность еще не придумана). Так что, вероятно, Bash прямо здесь. Если вы это сделаете, уcd ///
вас будет нормальный/
в обеих оболочках.Да, найден на unix.se !
источник
Символ тильды (
~
) имеет особое значение в оболочке. Когда это видно в любой команде, оно раскрывается до имени вашего домашнего каталога. Делаяcd ~
или такcd /home/aditya
же, он попадает в ваш домашний каталог.Поместив символ обратной косой черты (
\
) перед тильдой, вы указываете оболочке не выполнять расширение следующего специального символа (это называется экранированием оболочки). Делая это,cd \~
вы просите оболочку перейти в каталог с именем,~
который будет находиться в каталоге, в котором вы выполняете команду. Таким образомcd \~kernel-ppa
, вы перейдете в каталог под названием~kernel-ppa
, что является нормальным поведением.Отредактировано: больше на ~
Если вы напишите имя пользователя вашей системы после
~
, вы будете перемещены в домашний каталог этого пользователя. Выполнение Tabрасширения послеcd ~
расширится до имен пользователей, существующих в вашей системе. Если выполнить Tabзавершение послеcd ~k
, он расширяется до ~ kernoops, потому что в системном пользователе есть пользователь с именем kernoops с домашним каталогом/
. По мере расширенияcd ~k
результатов вcd ~kernoops/
конце косой черты и в домашний каталог/
, вы перешли к//
. Но это точно так же,/
как некоторые уже говорили ранее.источник