Mam folder o nazwie ~kernel-ppa
wewnątrz ~/Downloads
.
aditya@aditya-desktop:~$ cd Downloads/
aditya@aditya-desktop:~/Downloads$ ls
~kernel-ppa
Teraz po wpisaniu cd ~k
i 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 \~k
i 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 pwd
mówi, że tak //
. Co to dokładnie jest
command-line
bash
Aditya
źródło
źródło
tree
lub za pomocą,ls
a zauważysz, że tak się składa, że jest to pierwszy podfolder.~kernel-ppa
jest jedynym folderem w nim; jeśli po prostu uruchomięcd
i naciśniesz klawisz Tab, zostanie ono rozszerzone docd \~kernel-ppa/
. Nie muszę też uciekać!Odpowiedzi:
Jak wiesz,
~
rozwija się do twojego katalogu domowego. Wygląda jednak na to, że~john
tęsknisz za tym, że rozwija się on do katalogu domowego użytkownika o nazwie „John”.Sprawdź swój
/etc/passwd
plik:Ma nazwę „użytkownika systemu”
kernoops
(ze względu na wewnętrzne zgłaszanie błędów). Kiedy więc wpiszeszcd ~k
Tabpowłokę, dajesz pierwszeństwo (1) rozszerzaniu nazwy użytkownika przed rozszerzeniem lokalnych katalogów, i maszcd ~kernoops
. Teraz wynika z tego, że katalog domowy użytkownika „kernoops” jest/
, więc to jużcd
koniec.W mojej powłoce
zsh
nie mam podwójnego ukośnika (2):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~xdir
i żaden użytkownik nie zaczynax
; robieniecd ~x
Tabnie rozwija się i nie cytuje podanych~
błędów:(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 zrobiszcd ///
, będziesz mieć normalne/
w obu powłokach.Tak, znaleziono na unix.se !
źródło
Znak tyldy (
~
) ma specjalne znaczenie w powłoce. Gdy jest widoczny w dowolnym poleceniu, jest rozwijany do nazwy katalogu domowego. Robicd ~
lubcd /home/aditya
jest 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óbcd \~
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óbcd \~kernel-ppa
przejdziesz 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 pocd ~
spowoduje rozwinięcie do nazw użytkowników istniejących w systemie. Jeśli zrobisz to Tabpóźniejcd ~k
, zostanie rozwinięte do ~ kernoops, ponieważ w systemie użytkownika znajduje się użytkownik o nazwie kernoops z katalogiem osobistym/
. Po rozwinięciucd ~k
wynikówcd ~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.źródło