Für jede Shell ist eine Umgebungsvariable $ HOME festgelegt (Beispiel:) /Users/lotolo
. Wenn ich unter CSH bin, kann ich unsetenv HOME
und wenn ich das tue, cd
bin ich in meinem Haus. Ich habe dies auch mit bash ( unset HOME
) getestet und es ist das gleiche Verhalten. Woher weiß die Shell, wo mein / other_user zu Hause ist? Wo liest es diese Werte?
Dies ist kein Duplikat, da meine Frage nicht lautet, woher ich es weiß, sondern woher die Shell es weiß HOME
. Und dieses Verhalten wird auch auf andere Benutzer ausgeweitet.
/etc/passwd
. Einige Systeme können diese Informationen in LDAP-, NIS-Servern usw. speichern.getpwuid(3)
oder ähnliches auf. Einige Systeme können so konfiguriert werden, dass siegetpwuid(3)
Informationen von/etc/passwd
LDAP, NIS, NIS + usw. "Antworten:
Im Fall von
csh
undtcsh
wird der Wert der$HOME
Variablen zum Zeitpunkt des Starts der Shell aufgezeichnet ( in ihrer$home
Variablen, wie von @JdeBP angegeben ).Wenn Sie es vor dem Start deaktivieren, wird Folgendes angezeigt
csh
:Bei
bash
(und den meisten anderen Bourne-ähnlichen Muscheln) sehe ich ein anderes Verhalten als bei Ihnen.Der Inhalt der
$HOME
Variablen wird durch den Anmeldeprozess in der Benutzerdatenbank gegen den Benutzer gespeichert sind, basierend auf Informationen initialisiert Namen .Die Informationen zum Benutzernamen selbst sind nicht immer verfügbar. Alles, was eine Shell mit Sicherheit wissen kann, ist die Benutzer-ID des Prozesses, der sie ausführt, und mehrere Benutzer (mit unterschiedlichen Basisverzeichnissen) können dieselbe Benutzer-ID verwenden.
Also, wenn
$HOME
es einmal weg ist, gibt es keinen zuverlässigen Weg, es zurückzubekommen.Das Abfragen der Benutzerdatenbank (mit
getpwxxx()
Standard-API) nach dem Basisverzeichnis des ersten Benutzers, der dieselbe Benutzer-ID wie dasjenige hat, auf dem die Shell ausgeführt wird, wäre nur eine Annäherung (ganz zu schweigen von der Tatsache, dass sich die Benutzerdatenbank geändert haben könnte (oder die Basis) Verzeichnis wird seit dem Start der Anmeldesitzung als einmaliger Wert definiert.zsh
ist die einzige Shell, von der ich weiß, dass sie das macht:Alle anderen Shells, die ich versucht habe, beschweren sich entweder über dieses nicht eingestellte HOME oder verwenden es
/
als Standard-Home-Wert.Ein anderes Verhalten ist jedoch
fish
das, bei dem die Datenbank nach dem Benutzernamen abgefragt wird, in dem er gespeichert$USER
ist, odergetpwuid()
wenn nicht:SEGV, wenn der Benutzer nicht existiert ( https://github.com/fish-shell/fish-shell/issues/3599 ):
quelle
fish
Kopf, um zu sehen, ob der Bug auch da ist. Bearbeiten. Ja ist es.PATH
?TERM
?USER
?Querying the user database
... in derwould only be...
Tat nicht so klarDas tut es nicht. Sie führen das Experiment einfach nicht richtig durch. Wie Sie dem C-Shell-Handbuch entnehmen können,
cd
ändert sich der Befehl in den Wert derhome
Variablen, wenn keine Argumente angegeben werden. Wenn diese Variable nicht gesetzt ist, weiß sie nicht, wohin sie das Verzeichnis wechseln soll, und gibt einen Fehler aus:Sie haben die falsche Variable gelöscht. Es handelt sich nicht um
HOME
die Umgebungsvariable, sondern umhome
die interne Variable der C-Shell (die beim Starten der Shell anhand des Werts der vorherigen Variable initialisiert wird, ansonsten jedoch um eine eigenständige Variable).quelle
csh
aber anscheinend ist es auftcsh
Das System hat die Variable HOME zum Zeitpunkt der Anmeldung auf einen Pfadnamen des Basisverzeichnisses des Benutzers festgelegt. Es wird eingestellt von
Sie können den Wert ändern, aber achten Sie darauf, dass .bashrc, .profile, .xinitrc usw. nicht gelesen werden, wenn sie sich nicht im Ausgangsverzeichnis befinden.
quelle
usermod -d HOME_DIR
Befehl aktualisieren , wenn ein neuer Benutzer erstellt wird. Das Standard-Home ist / home / $ username und wird vom Anmeldeprogramm festgelegt.