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

8

Ich habe einen Ordner namens ~kernel-ppa in ~/Downloads .

[email protected]:~$ cd Downloads/
[email protected]:~/Downloads$ ls
~kernel-ppa

Wenn ich jetzt cd ~k eintippe und Tab für die automatische Erweiterung drücke, wird sie von der Shell auf cd ~kernoops/ anstatt cd ~kernel-ppa/ erweitert, obwohl der Ordner mit den gleichen Anfangsbuchstaben bereits vorhanden ist.

Damit die automatische Erweiterung funktioniert, muss ich sie mit \ verlassen. Wenn Sie also cd \~k verwenden und Tab drücken, wird es korrekt auf cd \~kernel-ppa/ erweitert. Sogar die Verwendung von cd \ und Drücken von Tab macht den Trick.

Warum ist das so und warum muss ich fliehen? Außerdem, was entgehe ich, da sogar ~ für die automatische Erweiterung nicht benötigt wird?

Wenn ich mit dem Fluss gehe und cd ~kernoops/ starte und Enter drücke, ändert sich der Status des Terminals in // :

[email protected]:~/Downloads$ cd ~kernoops/
[email protected]://$ pwd
//
[email protected]://$ 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
[email protected]://$ 

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

    
Aditya 02.04.2014, 15:30

2 Antworten

10

Wie Sie wissen, expandiert ~ in Ihr Home-Verzeichnis. Was Sie jedoch vermisst haben ist, dass ~john in das Home-Verzeichnis des Benutzers "John" expandiert.

Überprüfen Sie Ihre /etc/passwd -Datei:

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

Es hat einen "Systembenutzer" namens kernoops (für interne Fehlerberichte). Wenn Sie also cd ~k Tab eingeben, gibt die Shell der Erweiterung des Benutzernamens vor der Erweiterung der lokalen Verzeichnisse den Vorzug (1), und Sie haben cd ~kernoops . Jetzt ergibt sich, dass Benutzer "kernoops" home dir / ist, also cd s darauf.

In meiner Shell, zsh , habe ich keinen doppelten Schrägstrich (2):

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

Nebenbei bemerkt, dieser Verzeichnisname ist nicht gut durchdacht. Es wird dreifache Sorgfalt in Skripten und was auch immer brauchen. Die einzige schlechteste Idee, die ich denken kann, ist ein Tab darin einzubetten ...

Fußnoten:

(1) In zsh , auch wenn ich ein Verzeichnis mit dem Namen ~xdir habe und kein Benutzer mit x ; doing cd ~x Tab expandiert nicht und zitiert nicht ~ 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 erinnere mich, dass posix eine Ausnahme für das initiale // in einem Pfad gemacht hat - es sollte beibehalten werden, weil eine alte Unix-Variante (ich habe das apollos mit der Domain / OS, die das hatte) nutzte //machine-name/... für den nahtlosen Zugriff auf das Dateisystem anderer Maschinen im lokalen Netzwerk (die Sicherheit wurde noch nicht erfunden). Also wahrscheinlich ist Bash genau hier. Wenn du cd /// machst, wirst du in beiden Shells jedoch das normale / haben.

Ja, wurde auf unix.se !     

Rmano 02.04.2014, 16:03
7

Das Tilde-Zeichen ( ~ ) hat in der Shell eine besondere Bedeutung. Wenn es in einem Befehl angezeigt wird, wird es auf den Namen Ihres Basisverzeichnisses erweitert. Doing cd ~ oder cd /home/aditya ist identisch, es endet in Ihrem Home-Verzeichnis.

Wenn Sie vor die Tilde einen umgekehrten Schrägstrich ( \ ) setzen, weisen Sie die Shell an, die Erweiterung des folgenden Sonderzeichens nicht auszuführen (dies wird als Shell-Escape bezeichnet). Indem Sie cd \~ ausführen, bitten Sie die Shell, in ein Verzeichnis mit dem Namen ~ zu wechseln, das sich in dem Verzeichnis befindet, in dem Sie den Befehl ausführen. Wenn Sie also cd \~kernel-ppa verwenden, werden Sie in das Verzeichnis ~kernel-ppa gewechselt, was das normale Verhalten ist.

EDITED: mehr zu ~

Wenn Sie nach dem ~ einen Benutzernamen Ihres Systems schreiben, werden Sie in das Home-Verzeichnis dieses Benutzers verschoben. Eine Tab -Erweiterung nach cd ~ wird auf die auf Ihrem System vorhandenen Benutzernamen erweitert. Wenn Tab nach cd ~k abgeschlossen ist, wird es auf ~ kernoops erweitert, da im Systembenutzer ein Benutzer namens kernoops mit einem Home-Verzeichnis von / vorhanden ist. Da die Erweiterung von cd ~k in cd ~kernoops/ mit einem abschließenden Schrägstrich und das Home-Verzeichnis in / resultiert, werden Sie nach // verschoben. Aber das ist genau das gleiche wie / , wie einige bereits früher gesagt haben.

    
Benoit 02.04.2014 15:54

Tags und Links