En el caso de csh
y tcsh
, registra el valor de la $HOME
variable en el momento en que se inició el shell ( en su $home
variable como lo señaló @JdeBP ).
Si lo desarma antes de comenzar csh
, verá algo como:
$ (unset HOME; csh -c cd)
cd: No home directory.
Para bash
(y la mayoría de los otros shells tipo Bourne), veo un comportamiento diferente al tuyo.
bash-4.4$ unset HOME; cd
bash: cd: HOME not set
El contenido de la $HOME
variable se inicializa mediante el proceso de inicio de sesión en función de la información almacenada en la base de datos de usuario con su nombre de usuario .
La información sobre el nombre de usuario en sí no siempre está disponible. Todo lo que un shell puede saber con certeza es el ID de usuario del proceso que lo está ejecutando y varios usuarios (con diferentes directorios de inicio) pueden compartir el mismo ID de usuario.
Entonces, una vez que $HOME
se va, no hay una forma confiable de recuperarlo.
Consultar la base de datos de usuario (con getpwxxx()
API estándar) para el directorio de inicio del primer usuario que tiene el mismo uid que el que ejecuta el shell solo sería una aproximación (sin mencionar el hecho de que la base de datos de usuario podría haber cambiado (o el inicio el directorio se define como un valor único) desde que comenzó la sesión de inicio de sesión).
zsh
es el único shell que sé que hace eso:
$ env -u HOME ltrace -e getpw\* zsh -c 'cd && pwd'
zsh->getpwuid(1000, 0x496feb, 114, 0x7f9599004697) = 0x7f95992fddc0
/home/chazelas
+++ exited (status 0) +++
Todos los otros proyectiles que probé se quejan de que HOME no está configurado o lo usan /
como valor de inicio predeterminado.
Sin embargo, un comportamiento diferente es fish
el que parece consultar en la base de datos el nombre de usuario almacenado en $USER
caso de existir o hacer un getpwuid()
caso en caso contrario:
$ 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 cuando el usuario no existe ( 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 ''