Cada shell possui uma variável de ambiente $ HOME definida (ex:) /Users/lotolo
. Se eu estiver no csh, eu posso unsetenv HOME
e ainda assim cd
, estarei em minha casa. Eu testei isso também no bash ( unset HOME
) e é o mesmo comportamento. Então, como o shell sabe onde está o meu / other_user? Onde ele lê esses valores?
Isso não é uma duplicata, pois minha pergunta não é como eu sei, mas como o shell sabe HOME
. E esse comportamento também é estendido a outros usuários.
/etc/passwd
. Alguns sistemas podem armazenar essa informação em LDAP, servidores NIS, etc.getpwuid(3)
ou similares. Alguns sistemas podem ser configurados para "re-route"getpwuid(3)
para obter informações de/etc/passwd
, LDAP, NIS, NIS + etc.Respostas:
No caso de
csh
etcsh
, 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:Para
bash
(e para a maioria das outras conchas tipo Bourne), vejo um comportamento diferente do seu.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: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 umgetpwuid()
se não:SEGV quando o usuário não existe ( https://github.com/fish-shell/fish-shell/issues/3599 ):
fonte
fish
a cabeça dev git para ver se o bug está lá também. Editar. Sim.PATH
?TERM
?USER
?Querying the user database
...would only be...
não é tão claro, de fato #Não faz. Você não está realizando o experimento corretamente. Como você pode ver no manual do shell C, o
cd
comando muda para o valor dahome
variável, se fornecido sem argumentos. Se essa variável não estiver definida, ela não saberá para onde alterar o diretório e imprimirá um erro:Você desabilitou a variável errada. Não é
HOME
, a variável de ambiente, éhome
a variável interna do shell C (inicializada a partir do valor do primeiro quando o shell é inicializado, mas, caso contrário, é uma variável independente por si só).fonte
csh
mas aparentemente é um alias paratcsh
O sistema configurou a variável HOME no momento do login como um nome de caminho do diretório inicial do usuário. É definido por
Você pode alterar seu valor, mas preste atenção, pois .bashrc, .profile, .xinitrc, etc. não serão lidos se não estiverem no diretório inicial.
fonte
usermod -d HOME_DIR
comando, quando um novo usuário é criado. a página inicial padrão é / home / $ nome de usuário e é determinada pelo programa de login.