Im Fall von csh
und tcsh
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
:
$ (unset HOME; csh -c cd)
cd: No home directory.
Bei bash
(und den meisten anderen Bourne-ähnlichen Muscheln) sehe ich ein anderes Verhalten als bei Ihnen.
bash-4.4$ unset HOME; cd
bash: cd: HOME not set
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:
$ env -u HOME ltrace -e getpw\* zsh -c 'cd && pwd'
zsh->getpwuid(1000, 0x496feb, 114, 0x7f9599004697) = 0x7f95992fddc0
/home/chazelas
+++ exited (status 0) +++
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, oder getpwuid()
wenn nicht:
$ env -u HOME USER=bin ltrace -e getpw\* fish -c 'cd;pwd'
fish->getpwnam("bin") = 0x7fd2beba3d80
fish: Unable to create a configuration directory for fish. Your personal settings will not be saved. Please set the $XDG_CONFIG_HOME variable to a directory
where the current user has write access.
fish: Unable to create a configuration directory for fish. Your personal settings will not be saved. Please set the $XDG_CONFIG_HOME variable to a directory
where the current user has write access.
--- SIGCHLD (Child exited) ---
/bin
+++ exited (status 0) +++
$ env -u HOME -u USER ltrace -e getpw\* fish -c 'cd;pwd'
fish->getpwuid(1000, 0x7f529eb4fb28, 0x12d8790, 0x7f529e858697) = 0x7f529eb51dc0
fish->getpwnam("chazelas") = 0x7f529eb51d80
--- SIGCHLD (Child exited) ---
--- SIGCHLD (Child exited) ---
/home/chazelas
+++ exited (status 0) +++
SEGV, wenn der Benutzer nicht existiert ( https://github.com/fish-shell/fish-shell/issues/3599 ):
$ env -u HOME USER=foo fish -c ''
zsh: segmentation fault env -u HOME USER=foo fish -c ''