Nel caso di csh
e tcsh
, registra il valore della $HOME
variabile al momento dell'avvio della shell ( nella sua $home
variabile come notato da @JdeBP ).
Se lo disattivi prima di iniziare csh
, vedrai qualcosa di simile:
$ (unset HOME; csh -c cd)
cd: No home directory.
Per bash
(e la maggior parte delle altre conchiglie tipo Bourne), vedo un comportamento diverso dal tuo.
bash-4.4$ unset HOME; cd
bash: cd: HOME not set
Il contenuto della $HOME
variabile viene inizializzato dal processo di accesso in base alle informazioni memorizzate nel database utente in base al nome utente .
Le informazioni sul nome utente stesso non sono sempre disponibili. Tutto ciò che una shell può sapere con certezza è l'ID utente del processo che lo sta eseguendo e diversi utenti (con directory home diverse) possono condividere lo stesso ID utente.
Quindi, una volta $HOME
sparito, non esiste un modo affidabile per ripristinarlo.
Interrogare il database utente (con getpwxxx()
API standard) per la directory home del primo utente che ha lo stesso uid di quello che esegue la shell sarebbe solo un'approssimazione (per non parlare del fatto che il database utente potrebbe essere cambiato (o la home la directory viene definita come valore singolo) dall'inizio della sessione di accesso).
zsh
è l'unica shell che conosco che lo fa:
$ env -u HOME ltrace -e getpw\* zsh -c 'cd && pwd'
zsh->getpwuid(1000, 0x496feb, 114, 0x7f9599004697) = 0x7f95992fddc0
/home/chazelas
+++ exited (status 0) +++
Tutte le altre shell che ho provato si lamentano di quella HOME non impostata o la usano /
come valore home predefinito.
Tuttavia, si tratta di un comportamento diverso fish
, che sembra richiedere al database il nome utente memorizzato $USER
se presente o fare un getpwuid()
se no:
$ 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 quando l'utente non esiste ( 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 ''