No caso de csh
e tcsh
, ele registra o valor da $HOME
variável no momento em que o shell foi iniciado ( em sua $home
variável conforme observado por @JdeBP ).
Se você desmarcá-lo antes de começar csh
, verá algo como:
$ (unset HOME; csh -c cd)
cd: No home directory.
Para bash
(e para a maioria das outras conchas tipo Bourne), vejo um comportamento diferente do seu.
bash-4.4$ unset HOME; cd
bash: cd: HOME not set
O conteúdo da $HOME
variável é inicializado pelo processo de login com base nas informações armazenadas no banco de dados do usuário com relação ao seu nome de usuário .
As informações sobre o próprio nome do usuário nem sempre estão disponíveis. Tudo que um shell pode ter certeza é o ID do usuário do processo que está sendo executado e vários usuários (com diretórios pessoais diferentes) podem compartilhar o mesmo ID do usuário.
Assim, uma vez $HOME
terminado, não há maneira confiável de recuperá-lo.
Consultar o banco de dados do usuário (com getpwxxx()
API padrão) para o diretório inicial do primeiro usuário que possui o mesmo uid que o que executa o shell seria apenas uma aproximação (sem mencionar o fato de que o banco de dados do usuário poderia ter sido alterado (ou o endereço inicial) diretório definido como um valor único) desde que a sessão de login foi iniciada).
zsh
é o único shell que eu sei que faz isso:
$ env -u HOME ltrace -e getpw\* zsh -c 'cd && pwd'
zsh->getpwuid(1000, 0x496feb, 114, 0x7f9599004697) = 0x7f95992fddc0
/home/chazelas
+++ exited (status 0) +++
Todas as outras conchas que tentei queixam-se da HOME não configurada ou usam /
como valor inicial padrão.
No entanto, é um comportamento diferente fish
, que parece consultar o banco de dados pelo nome de usuário armazenado, $USER
se houver, ou fazer um getpwuid()
se não:
$ 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 o usuário não 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 ''