Warum wird cd ~ k (& tab) zu cd ~ kernoops erweitert, wenn ich bereits einen Ordner mit dem Namen "~ kernel-ppa" in pwd habe?

8

Ich habe einen Ordner mit dem Namen nach ~kernel-ppainnen ~/Downloads.

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

Wenn ich jetzt für die automatische Erweiterung tippe cd ~kund drücke Tab, wird sie von der Shell erweitert, cd ~kernoops/anstatt cd ~kernel-ppa/dass der Ordner mit denselben Startzeichen bereits vorhanden ist.

Damit die automatische Erweiterung funktioniert, muss ich sie umgehen \. Wenn cd \~kSie also Tabrichtig verwenden und drücken, wird es erweitert cd \~kernel-ppa/. Auch das Verwenden cd \und Drücken Tabreicht aus.

Warum ist es so und warum muss ich fliehen? Was entkomme ich außerdem, da ~es für die automatische Erweiterung nicht einmal erforderlich ist?

Wenn ich mit dem Fluss gehe und renne cd ~kernoops/und drücke Enter, ändert sich der Terminalstatus zu //:

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

Dies sieht aus wie das /Verzeichnis, pwdsagt es aber //. Was genau ist das?

Aditya
quelle
@ RaduRădeanu Weder ist es "/ home / aditya / Downloads / ~ kernel-ppa"
Elliott Frisch
Zuerst führt "cd ~ kernoops /" Sie zu "cd / home / kernoops /", das es nicht gibt. Stattdessen erhalten Sie "cd //", eine andere Art, "cd /" zu schreiben - es ist das Stammverzeichnis des Root-Dateisystems, das seltsam aussieht.
Elliott Frisch
Wenn Sie wissen, warum das einzelne Escapezeichen "\\" funktioniert, schauen Sie sich Ihren Ordner mit treeoder mit an, lsund Sie werden feststellen, dass dies zufällig der erste Unterordner ist.
Elliott Frisch
@ElliottFrisch: Mir ist gerade aufgefallen, dass da ~kernel-ppader einzige Ordner darin ist; Wenn ich nur renne cd und die Tabulatortaste drücke, wird es auf erweitert cd \~kernel-ppa/. Ich muss auch nicht fliehen!
Aditya
Ja. Wenn Sie weiterhin die Tabulatortaste drücken, werden Sie durch andere verfügbare Abschlüsse blättern.
Elliott Frisch

Antworten:

10

Wie Sie wissen, wird es ~in Ihr Home-Verzeichnis erweitert. Was Sie jedoch vermisst zu haben scheinen, ist die ~johnErweiterung auf das Home-Verzeichnis des Benutzers mit dem Namen "john".

Überprüfen Sie Ihre /etc/passwdDatei:

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

Es hat einen "Systembenutzer" namens kernoops(aus Gründen der internen Fehlerberichterstattung). Wenn Sie also cd ~kTabdie Shell eingeben, wird die Erweiterung des Benutzernamens vor der Erweiterung der lokalen Verzeichnisse bevorzugt (1), und Sie haben cd ~kernoops. Jetzt ergibt sich, dass Benutzer "Kernoops" Home-Verzeichnis ist /, also ist es cddazu.

In meiner Shell habe zshich keinen doppelten Schrägstrich (2):

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

Abgesehen davon ist dieser Verzeichnisname nicht gut durchdacht. Es wird dreifache Sorgfalt in Skripten und was auch immer erfordern. Die einzig schlimmste Idee, die ich mir vorstellen kann, ist das Einbetten eines Tabs ...


Fußnoten:

(1) In zsh, selbst wenn ich ein Verzeichnis mit dem Namen habe ~xdirund kein Benutzer mit beginnt x; Doing erweitert cd ~xTabsich nicht und zitiert nicht den ~gibt Fehler:

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

(2) Ich scheine mich zu erinnern, dass posix eine Ausnahme für die Initiale //in einem Pfad gemacht hat - es sollte beibehalten werden, da eine alte Unix-Variante (ich habe die Apollo mit Domain / OS verwendet, die diese hatte) für //machine-name/...den nahtlosen Zugriff auf andere Computer verwendet wurde. Dateisystem im lokalen Netzwerk (Sicherheit wurde noch nicht erfunden). Also ist Bash wahrscheinlich genau hier. Wenn Sie dies tun, haben cd ///Sie jedoch das Normal /in beiden Shell.

Ja, auf unix.se gefunden !

Rmano
quelle
1
Ein anderes bekanntes Legacy-Betriebssystem verwendet eine solche Doppel-Schrägstrich-Notation, aber die Schrägstriche werden normalerweise rückwärts geschrieben, und ich bin nicht sicher, ob es Schrägstriche für den Zugriff auf solche netzwerkfernen Dateisysteme akzeptiert. ;-)
R .. GitHub STOP HELPING ICE
7

Das Tilde-Zeichen ( ~) hat in der Shell eine besondere Bedeutung. Wenn es in einem Befehl angezeigt wird, wird es auf den Namen Ihres Home-Verzeichnisses erweitert. Wenn Sie dies tun cd ~oder cd /home/adityadasselbe tun , landet es in Ihrem Home-Verzeichnis.

Indem Sie ein Backslash-Zeichen ( \) vor die Tilde setzen, weisen Sie die Shell an, die Erweiterung des folgenden Sonderzeichens nicht durchzuführen (dies wird als Shell-Escape bezeichnet). Wenn cd \~Sie dies tun , bitten Sie die Shell, in ein Verzeichnis mit dem Namen zu wechseln ~, das sich unter dem Verzeichnis befindet, in dem Sie den Befehl ausführen. Wenn Sie dies tun cd \~kernel-ppa, wechseln Sie in das Verzeichnis namens ~kernel-ppa, was das normale Verhalten ist.

EDITIERT: mehr zu ~

Wenn Sie nach dem einen Benutzernamen Ihres Systems schreiben ~, werden Sie in das Ausgangsverzeichnis dieses Benutzers verschoben. Wenn Sie danach eine TabErweiterung durchführen, cd ~werden die auf Ihrem System vorhandenen Benutzernamen erweitert. Wenn der Vorgang Tabdanach abgeschlossen ist cd ~k, wird er auf ~ kernoops erweitert, da der Systembenutzer einen Benutzer mit dem Namen kernoops mit dem Basisverzeichnis von enthält /. Wenn die Erweiterung der cd ~kErgebnisse zu cd ~kernoops/einem abschließenden Schrägstrich führt und das Home-Verzeichnis angezeigt wird /, werden Sie zu verschoben //. Dies ist jedoch genau das Gleiche /wie einige andere bereits zuvor gesagt haben.

Benoit
quelle
Danke für die Antwort. Die Kombination Ihrer und der Antworten von @ Rmano beseitigt die Verwirrung vollständig :)
Aditya