Os programas de login definem essas variáveis. É claro que você pode anular o HOME se precisar, ou até mesmo desabilitá-lo - mas, a menos que você se esforçasse para modificar a fonte de cada programa, você nunca poderia se livrar dele.
Observe que, mesmo que você altere HOME para outra coisa, a origem autoritativa de seu diretório pessoal sempre estará presente em passwd
ou no derivado nsswitch
.
Se você fizer login por meio de um TTY real, o login será definido.
Do util-linux em login-utils / login.c
setenv("HOME", pwd->pw_dir, 0); /* legal to override */
setenv("USER", pwd->pw_name, 1);
setenv("SHELL", pwd->pw_shell, 1);
setenv("TERM", termenv, 1);
Se você fizer login via SSH, o sshd irá defini-lo:
De session.c em sshd
child_set_env(&env, &envsize, "USER", pw->pw_name);
child_set_env(&env, &envsize, "LOGNAME", pw->pw_name);
child_set_env(&env, &envsize, "HOME", pw->pw_dir);
Se você fizer login via GDM, ele será configurado lá.
Do gdm no daemon / gdm-session-worker.c
gdm_session_worker_set_environment_variable (worker, "LOGNAME", worker->priv->username);
gdm_session_worker_set_environment_variable (worker, "USER", worker->priv->username);
gdm_session_worker_set_environment_variable (worker, "USERNAME", worker->priv->username);
gdm_session_worker_set_environment_variable (worker, "HOME", home);
gdm_session_worker_set_environment_variable (worker, "SHELL", shell);