Dans le cas de csh
et tcsh
, il enregistre la valeur de la $HOME
variable au moment du démarrage du shell ( dans sa $home
variable comme noté par @JdeBP ).
Si vous le désactivez avant de commencer csh
, vous verrez quelque chose comme:
$ (unset HOME; csh -c cd)
cd: No home directory.
Pour bash
(et la plupart des autres obus de type Bourne), je vois un comportement différent du vôtre.
bash-4.4$ unset HOME; cd
bash: cd: HOME not set
Le contenu de la $HOME
variable est initialisé par le processus de connexion sur la base des informations stockées dans la base de données utilisateur par rapport à votre nom d' utilisateur .
Les informations sur le nom d'utilisateur lui-même ne sont pas toujours disponibles. Tout ce qu'un shell peut savoir avec certitude, c'est l'ID utilisateur du processus qui l'exécute et plusieurs utilisateurs (avec des répertoires personnels différents) peuvent partager le même ID utilisateur.
Donc, une fois $HOME
parti, il n'y a aucun moyen fiable de le récupérer.
L'interrogation de la base de données utilisateur (avec getpwxxx()
l'API standard) pour le répertoire personnel du premier utilisateur qui a le même uid que celui qui exécute le shell ne serait qu'une approximation (sans parler du fait que la base de données utilisateur aurait pu changer (ou le répertoire principal) répertoire étant défini comme une valeur unique) depuis le début de la session de connexion).
zsh
est le seul shell que je connaisse qui fait ça:
$ env -u HOME ltrace -e getpw\* zsh -c 'cd && pwd'
zsh->getpwuid(1000, 0x496feb, 114, 0x7f9599004697) = 0x7f95992fddc0
/home/chazelas
+++ exited (status 0) +++
Tous les autres shells que j'ai essayés se plaignent de ce HOME non défini ou utilisent /
comme valeur par défaut.
Pourtant, un comportement différent est celui fish
de, qui semble interroger la base de données pour le nom d'utilisateur stocké dans le $USER
cas échéant ou faire un getpwuid()
sinon:
$ 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 lorsque l'utilisateur n'existe pas ( 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 ''