Dlaczego cd ~ k (& tab) rozwija się do cd ~ kernoops, skoro mam już folder o nazwie „~ kernel-ppa” w pwd?

8

Mam folder o nazwie ~kernel-ppawewnątrz ~/Downloads.

aditya@aditya-desktop:~$ cd Downloads/
aditya@aditya-desktop:~/Downloads$ ls
~kernel-ppa

Teraz po wpisaniu cd ~ki prasa Tabdo automatycznego rozszerzania, powłoka rozszerza go cd ~kernoops/zamiast cd ~kernel-ppa/chociaż folder z samych znaków wyjściowych jest już obecny.

Aby automatyczne rozszerzenie działało, muszę z tym uciec \. W ten sposób prawidłowe użycie cd \~ki naciśnięcie Tabrozszerza to do cd \~kernel-ppa/. Nawet użycie cd \i naciśnięcie Tabzałatwia sprawę.

Dlaczego tak jest i dlaczego muszę uciec? Co więcej, przed czym uciekam, skoro nawet ~nie jest wymagana do automatycznej ekspansji?

Jeśli pójdę z przepływem i biegnę cd ~kernoops/i nacisnę Enter, stan terminala zmienia się na //:

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://$ 

To wygląda jak /katalog, ale pwdmówi, że tak //. Co to dokładnie jest

Aditya
źródło
@ RaduRădeanu Ani to, "/ home / aditya / Downloads / ~ kernel-ppa"
Elliott Frisch
Po pierwsze, „cd ~ kernoops /” zabiera cię do „cd / home / kernoops /”, który nie istnieje. Zamiast tego dostajesz „cd //”, który jest innym sposobem zapisu „cd /” - to katalog główny głównego systemu plików, który wygląda dziwnie.
Elliott Frisch
Jeśli chodzi o to, dlaczego działa pojedynczy klawisz ucieczki „\\”, spójrz na swój folder z treelub za pomocą, lsa zauważysz, że tak się składa, że ​​jest to pierwszy podfolder.
Elliott Frisch
@ElliottFrisch: Właśnie zauważyłem, że ponieważ ~kernel-ppajest jedynym folderem w nim; jeśli po prostu uruchomię cd i naciśniesz klawisz Tab, zostanie ono rozszerzone do cd \~kernel-ppa/. Nie muszę też uciekać!
Aditya
Tak. Ponadto, jeśli będziesz naciskać TAB, będziesz przechodzić między innymi dostępnymi uzupełnieniami.
Elliott Frisch

Odpowiedzi:

10

Jak wiesz, ~rozwija się do twojego katalogu domowego. Wygląda jednak na to, że ~johntęsknisz za tym, że rozwija się on do katalogu domowego użytkownika o nazwie „John”.

Sprawdź swój /etc/passwdplik:

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

Ma nazwę „użytkownika systemu” kernoops(ze względu na wewnętrzne zgłaszanie błędów). Kiedy więc wpiszesz cd ~kTabpowłokę, dajesz pierwszeństwo (1) rozszerzaniu nazwy użytkownika przed rozszerzeniem lokalnych katalogów, i masz cd ~kernoops. Teraz wynika z tego, że katalog domowy użytkownika „kernoops” jest /, więc to już cdkoniec.

W mojej powłoce zshnie mam podwójnego ukośnika (2):

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

Nawiasem mówiąc, ta nazwa katalogu nie jest dobrze przemyślana. Będzie wymagało potrójnej opieki w skryptach i cokolwiek innego. Jedynym najgorszym pomysłem, jaki mogę sobie wyobrazić, jest osadzenie w nim karty ...


Przypisy:

(1) W zsh, nawet jeśli mam katalog o nazwie ~xdiri żaden użytkownik nie zaczyna x; robienie cd ~xTabnie rozwija się i nie cytuje podanych ~błędów:

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

(2) Wydaje mi się, że pamiętam, że posix zrobił wyjątek dla inicjału //na ścieżce - należy go zachować, ponieważ jakiś stary wariant unixa (użyłem apollos z domeną / systemem operacyjnym, który go miał) używany //machine-name/...do płynnego dostępu do innych maszyn ” system plików w sieci lokalnej (zabezpieczenia nie zostały jeszcze wynalezione). Więc prawdopodobnie bash jest tutaj. Jeśli to zrobisz cd ///, będziesz mieć normalne /w obu powłokach.

Tak, znaleziono na unix.se !

Rmano
źródło
1
Inny dobrze znany starszy system operacyjny używa takiej notacji podwójnego ukośnika, ale jego ukośniki są zwykle zapisywane wstecz i nie jestem pewien, czy akceptuje ukośniki w celu uzyskania dostępu do podobnych systemów sieciowych. ;-)
R .. GitHub ZATRZYMAJ POMOC W LODZIE
7

Znak tyldy ( ~) ma specjalne znaczenie w powłoce. Gdy jest widoczny w dowolnym poleceniu, jest rozwijany do nazwy katalogu domowego. Robi cd ~lub cd /home/adityajest taka sama, to kończy się w katalogu domowym.

Umieszczając znak odwrotnego ukośnika ( \) przed tyldą, nakazujesz powłoce, aby nie rozwijała następującego znaku specjalnego (jest to tak zwane ucieczka powłoki). W ten sposób cd \~poprosisz powłokę o przejście do katalogu o nazwie, ~który będzie znajdować się w katalogu, w którym wykonujesz polecenie. W ten sposób cd \~kernel-ppaprzejdziesz do katalogu o nazwie ~kernel-ppa, co jest normalnym zachowaniem.

EDYCJA: więcej na ~

Jeśli napiszesz nazwę użytkownika swojego systemu po ~, nastąpi przeniesienie do katalogu domowego tego użytkownika. Wykonanie Tabrozwinięcia po cd ~spowoduje rozwinięcie do nazw użytkowników istniejących w systemie. Jeśli zrobisz to Tabpóźniej cd ~k, zostanie rozwinięte do ~ kernoops, ponieważ w systemie użytkownika znajduje się użytkownik o nazwie kernoops z katalogiem osobistym/ . Po rozwinięciu cd ~kwyników cd ~kernoops/za pomocą ukośnika i katalogu głównego /, jesteś przenoszony do //. Ale jest to dokładnie to samo, /co niektórzy wcześniej powiedzieli.

Benoit
źródło
Dziękuję za odpowiedź. Połączenie odpowiedzi twojej i @ Rmano całkowicie usuwa zamieszanie :)
Aditya