-
A documentação diz o seguinte sobre a variável
$HOME
:HOME <S>
The default argument for the cd command. This is not set automatically by the shell in sh, ksh or csh emulation, but it is typically present in the environment anyway, and if it becomes set it has its usual special behaviour.Eu li o contrário, quando
zsh
é invocado por si só, ele reúne as informações sobre o homedir do gerenciamento de usuários do sistema. Este snippet (incompleto) (deSrc/init.c
) serve como prova:/* Get password entry and set info for 'USERNAME' */ if ((pswd = getpwuid(cached_uid))) { if (EMULATION(EMULATE_ZSH)) home = metafy(pswd->pw_dir, -1, META_DUP); ... /* Try a cheap test to see if we can initialize 'PWD' from 'HOME'. In non-native emulations HOME must come from the environment; we're not allowed to set it locally. */ if (EMULATION(EMULATE_ZSH)) ptr = home; else ptr = zgetenv("HOME"); ...
Portanto, sem emulação (ou seja, "emular zsh"), o homedir é determinado pela chamada do sistema
getpwuid
. Somente de outra forma, o$HOME
do ambiente é usado. -
Não consigo reproduzir sua "mágica" com
$PWD
e$OLDPWD
. Mas talvez você deva considerar invocar zsh comozsh -f
, para que nenhuma configuração de usuário (zsh conheça seu homedir!) E de todo o sistema seja obtida. Com esse comando eu recebo o seguinte ambiente em uma caixa debian:$ pwd /tmp $ env -i zsh -f jessie% env HOME=/home/user LOGNAME=user SHLVL=1 PWD=/tmp OLDPWD=/tmp _=/usr/bin/env jessie%
Portanto, não há valores surpreendentes de
$PWD
e$OLDPWD
. O código-fonte que define esses parâmetros segue diretamente para o código acima:else if ((ptr = zgetenv("PWD")) && (strlen(ptr) < PATH_MAX) && (ptr = metafy(ptr, -1, META_STATIC), ispwd(ptr))) pwd = ztrdup(ptr); else { pwd = NULL; pwd = metafy(zgetcwd(), -1, META_DUP); }
oldpwd = ztrdup(pwd); /* initialize
OLDPWD' =
PWD' */Portanto, se
$HOME
não for definido no ambiente, uma funçãozgetcwd
será usada. Eu não rastreei isso, mas aposto, ele retorna o diretório de trabalho atual;)
. Finalmente$OLDPWD
é inicializado com o mesmo valor.
Todos os exemplos e trechos de código são tirados de zsh 5.0.5-dev-0