Почему cd ~ k (& tab) расширяется до cd ~ kernoops, когда у меня уже есть папка с именем ~ ~ kernel-ppa в pwd?

8

У меня есть папка с именем ~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говорит, что это так //. Что именно это?

Адитья
источник
@ RaduRădeanu Ни то, ни другое, это "/ home / aditya / Downloads / ~ kernel-ppa"
Эллиот Фриш
Во-первых, «cd ~ kernoops /» ведет вас к «cd / home / kernoops /», который не существует. Вместо этого вы получаете «cd //», который является другим способом записи «cd /» - это корневой каталог корневой файловой системы, который выглядит странно.
Эллиотт Фриш
Что касается того, почему работает одиночный escape "\\", взгляните на вашу папку с treeили с, lsи вы заметите, что это первая подпапка.
Эллиот Фриш
@ElliottFrisch: я только что заметил, что, поскольку ~kernel-ppaэто единственная папка внутри него; если я просто запускаю cd и нажимаю вкладку, он расширяется до cd \~kernel-ppa/. Мне тоже не нужно убегать!
Адитья
Да. Кроме того, если вы продолжите нажимать TAB, вы будете циклически проходить другие доступные дополнения.
Эллиотт Фриш

Ответы:

10

Как известно, ~расширяется до вашего домашнего каталога. Но то, что вы, кажется, упустили, это то, что он ~johnрасширяется до домашнего каталога пользователя с именем "john".

Проверьте ваш /etc/passwdфайл:

% grep ker /etc/passwd
kernoops:x:107:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false

У него есть имя «системный пользователь» kernoops(по причинам, связанным с внутренней отчетностью об ошибках). Поэтому, когда вы cd ~kTabнабираете текст, оболочка отдает предпочтение (1) расширению имени пользователя перед расширением локальных каталогов, и вы это делаете cd ~kernoops. Теперь это приводит к тому, что домашний каталог пользователя "kernoops" есть /, так что он cdк нему.

В моей оболочке zshу меня нет двойной косой черты (2):

[:/] % cd ~kernoops/ 
[:/] % pwd
/
[:/] % cd //
[:/] % pwd
/

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


Примечания:

(1) zshдаже если у меня есть каталог с именем ~xdirи нет пользователя, начинающегося с x; выполнение cd ~xTabне расширяется и не цитирует ~ошибку:

[:~/tmp/x] %  mkdir \~xdir
[:~/tmp/x] % ls
~xdir
[:~/tmp/x] % cd ~xdir  
zsh: no such user or named directory: xdir
[:~/tmp/x] 1 % 

(2) Кажется, я помню, что posix сделал исключение для инициала //в пути - его следует поддерживать, потому что какой-то старый вариант Unix (я использовал apollos с Domain / OS, у которого это было), использовался //machine-name/...для бесшовного доступа к другим машинам » файловая система в локальной сети (безопасность еще не придумана). Так что, вероятно, Bash прямо здесь. Если вы это сделаете, у cd ///вас будет нормальный /в обеих оболочках.

Да, найден на unix.se !

Rmano
источник
1
Другая известная устаревшая ОС использует двойную косую нотацию, подобную этой, но ее косые черты обычно записываются в обратном направлении, и я не уверен, принимает ли она прямую косую черту для доступа к удаленным сетевым файловым системам. ;-)
R .. GitHub ОСТАНОВИТЬ, ПОМОГАЯ ЛЬДУ
7

Символ тильды ( ~) имеет особое значение в оболочке. Когда это видно в любой команде, оно раскрывается до имени вашего домашнего каталога. Делая cd ~или так cd /home/adityaже, он попадает в ваш домашний каталог.

Поместив символ обратной косой черты ( \) перед тильдой, вы указываете оболочке не выполнять расширение следующего специального символа (это называется экранированием оболочки). Делая это, cd \~вы просите оболочку перейти в каталог с именем, ~который будет находиться в каталоге, в котором вы выполняете команду. Таким образом cd \~kernel-ppa, вы перейдете в каталог под названием ~kernel-ppa, что является нормальным поведением.

Отредактировано: больше на ~

Если вы напишите имя пользователя вашей системы после ~, вы будете перемещены в домашний каталог этого пользователя. Выполнение Tabрасширения после cd ~расширится до имен пользователей, существующих в вашей системе. Если выполнить Tabзавершение после cd ~k, он расширяется до ~ kernoops, потому что в системном пользователе есть пользователь с именем kernoops с домашним каталогом /. По мере расширения cd ~kрезультатов в cd ~kernoops/конце косой черты и в домашний каталог /, вы перешли к //. Но это точно так же, /как некоторые уже говорили ранее.

Benoit
источник
Спасибо за ответ. Сочетание ваших ответов и ответов @ Rmano полностью устраняет путаницу :)
Aditya