Bedeutung von Tilde in Linux Bash (nicht Home-Verzeichnis)

106

Zunächst einmal weiß ich, dass dies ~/das Home-Verzeichnis ist. CDing zu ~oder ~/bringt mich in das Home-Verzeichnis.

Allerdings cd ~Xnimmt mich zu einem besonderen Ort, wo Xalles zu sein scheint.

Wenn ich in Bash " cd ~" drücke und die Tabulatortaste drücke, werden eine Reihe möglicher ~XOptionen wie ~mailund ~postgresund angezeigt ~ssh. Wenn ich zu diesen Ordnern gehe und a mache, pwdsehe ich, dass sich diese Ordner nicht im Ausgangsverzeichnis befinden. Sie sind überall.

Sie sind keine Aliase. Ich habe nachgesehen. Sie sind keine env.Variablen, sonst würden sie eine benötigen $.

Was setzt diese Links und wo finde ich, wo diese gesetzt werden?

jbu
quelle
~ X gibt einfach das Literal "~ X" zurück, aber ~ gibt $ HOME zurück und ~ + gibt $ PWD zurück - sie sind nichts Besonderes, außer dass sie Shell-Variablen abrufen. dh sie speichern die Werte nicht und führen keinen Befehl aus, um sie nachzuschlagen. Sie sind bereits definiert. Hast du versucht ~ -? Ich kann mir keine Verwendung dafür vorstellen, aber es gibt wieder eine Shell-Variable $ OLDPWD
SDsolar

Antworten:

71

Es ist eine Bash-Funktion namens " Tilde-Erweiterung ". Es ist eine Funktion der Shell, nicht des Betriebssystems. Sie werden zum Beispiel mit csh ein anderes Verhalten bekommen.

Um Ihre Frage zu beantworten, woher die Informationen stammen: Ihr Home-Verzeichnis stammt aus der Variablen $HOME(unabhängig davon, was Sie dort speichern), während die Homes anderer Benutzer in Echtzeit mithilfe von abgerufen werden getpwent(). Diese Funktion wird normalerweise von NSS gesteuert . Daher werden standardmäßig Werte herausgezogen /etc/passwd, obwohl sie so konfiguriert werden können, dass die Informationen unter Verwendung einer beliebigen Quelle abgerufen werden, z. B. NIS, LDAP oder eine SQL-Datenbank.

Die Tilde-Erweiterung ist mehr als die Suche nach Basisverzeichnissen. Hier ist eine Zusammenfassung:

~              $HOME
~fred          (freds home dir)

~+             $PWD       (your current working directory)
~-             $OLDPWD    (your previous directory)
~1             `dirs +1`
~2             `dirs +2`
~-1            `dirs -1`

dirsund ~1, ~-1etc., werden in Verbindung mit pushdund popd.

tylerl
quelle
als Hinweis Fisch unterstützt keine von ihnen außer der einfachen Tilde (~)
warum kamen sie auf ~+? scheint eher nutzlos.
Cregox
3
~ + ist ungefähr das gleiche wie. Um jedoch so etwas wie ./file zu verwenden, muss es zum Dateisystem gehen und herausfinden, wo. befindet sich - es dauert einige Zyklen. Die Verwendung von ~ + spart die Arbeit, indem einfach der Inhalt der Shell-Variablen $ PWD zurückgegeben wird, die bereits beim Durchlaufen des Dateisystems definiert wurde.
SDsolar
32

Dies sind die Home-Verzeichnisse der Benutzer. Versuchen Sie es cd ~(your username)zum Beispiel.

Ana Betts
quelle
1
Sie sind keine Symlinks, Dienstkonten haben keine Home-Verzeichnisse unter / home
Ana Betts
Beste Antwort in meinem Fall. In meinem speziellen Fall war es auch das Stammverzeichnis / der Stammordner, nicht der Basisordner.
wlwl2
16

Sind sie die Home-Verzeichnisse der Benutzer in /etc/passwd? Dienste wie Postgres, Sendmail, Apache usw. erstellen Systembenutzer mit Home-Verzeichnissen wie normale Benutzer.

Sean Bright
quelle
2
In der Tat sind sie ~ Benutzername ist das Home-Verzeichnis des angegebenen Benutzers
Steve Weet
14

Das sind Benutzer. Überprüfen Sie Ihre /etc/passwd.

cd ~username führt Sie zum Home-Verzeichnis dieses Benutzers.

Joakim Elofsson
quelle
FTW. Upvote. TNX für die Aufklärung. Ich frage mich, wie viele Zyklen und vielleicht sogar eine Unterschale an diesem beteiligt sind. Stellen Sie sich vor, Ihr System hat 3K-Benutzer, wie bei einem kleinen ISP. Huch.
SDsolar
9

Auf meinem Computer habe ich aufgrund der Art und Weise, wie ich Dinge eingerichtet habe, Folgendes getan:

cd ~             # /work1/jleffler
cd ~jleffler     # /u/jleffler

Der erste achtet auf den Wert der Umgebungsvariablen $HOME; Ich habe mein bewusst $HOMEauf ein lokales Dateisystem anstatt auf ein NFS-gemountetes Dateisystem eingestellt. Der zweite liest aus der Kennwortdatei (ungefähr; NIS macht die Sache etwas komplizierter) und stellt fest, dass in der Kennwortdatei angegeben ist, dass sich mein Ausgangsverzeichnis befindet, /u/jlefflerund wechselt in dieses Verzeichnis.

Das ärgerliche ist, dass sich die meiste Software wie oben verhält (und die POSIX-Spezifikation für die Shell erfordert dieses Verhalten). Ich verwende eine Software (und ich habe keine große Auswahl), die die Informationen aus der Kennwortdatei als den aktuellen Wert von $ HOME behandelt, was falsch ist.

Dies auf die Frage anwenden - wie andere bereits betont haben, cd ~xgeht ' ' in das Ausgangsverzeichnis des Benutzers 'x' und allgemeiner, wenn eine Tilde-Erweiterung durchgeführt wird, ~xdas Ausgangsverzeichnis des Benutzers 'x' (und es ist ein Fehler) wenn Benutzer 'x' nicht existiert).


Es könnte erwähnenswert sein, dass:

cd ~-       # Change to previous directory ($OLDPWD)
cd ~+       # Change to current directory ($PWD)

Ich kann nicht sofort eine Verwendung für ' ~+' finden, es sei denn, Sie machen einige seltsame Dinge mit dem Verschieben von Symlinks im Pfad, der zum aktuellen Verzeichnis führt.

Sie können auch tun:

cd -

Das heißt das gleiche wie ~-.

Jonathan Leffler
quelle
1
Info cd ~+: Sie können damit möglicherweise überprüfen, ob ein Verzeichnis, in dem Sie sich gerade befinden, noch vorhanden ist - auch wenn dies eine ziemlich unorthodoxe Methode ist.
Professorsloth
1

Wenn Sie verwenden, stammt autofsdie Erweiterung möglicherweise tatsächlich von /etc/auto.home(oder ähnlich für Ihre Distribution). Zum Beispiel /etc/auto.mastersieht mein so aus:

/home2 auto.home --timeout 60

und /etc/auto.homesieht aus wie:

mgalgs -rw,noquota,intr space:/space/mgalgs
mgalgs
quelle
0

Möglicherweise werden OpenDirectory / ActiveDirectory / LDAP-Benutzer in Ihrem Home-Verzeichnis "automatisch bereitgestellt".

In * nix ~wird in Ihr Home-Verzeichnis aufgelöst. Ebenso ~Xwird zu 'Benutzer X' aufgelöst.

Ähnlich wie bei der automatischen Bereitstellung von Verzeichnissen wird OpenDirectory / ActiveDirectory / LDAP in größeren Unternehmensumgebungen verwendet, um Benutzerverzeichnisse automatisch bereitzustellen. Diese Benutzer können tatsächliche Personen sein oder es können Maschinenkonten sein, die erstellt wurden, um verschiedene Funktionen bereitzustellen.

Wenn Sie eingeben ~Tab, wird eine Liste der Benutzer auf Ihrem Computer angezeigt.

JS.
quelle