Where is the $HOME environment variable set?

How to change it: https://superuser.com/a/694428/76871

(it is defined in /etc/passwd; edit it with usermod -d /some/new/home/dir myusername, though modifying the file may work)


When the home directory is written to the $HOME environment variable: https://superuser.com/a/271935/76871 https://superuser.com/a/271927/76871

(the string is passed in as an argument to the login program, which will later set the $HOME env var)


sidenote: When the $HOME variable is not defined, the bash shell will fetch it from its official definition in /etc/passwd and define it in that script. This may indicate that your scripting or programming language may have special treatment for the $HOME variable since it is slightly 'important' (though perhaps not as much as $PATH).

https://superuser.com/a/1502106/76871


On Linux, the HOME environment variable is set by the login program:

  • by login on console, telnet and rlogin sessions
  • by sshd for SSH connections
  • by gdm, kdm or xdm for graphical sessions.

The login program arranges it before calling exec on your shell (by including it in the arguments to exec), based on the value in /etc/passwd.


Edit this by running: usermod -d /home/whatever_dir whatever_user.

Please note that this will (obviously) be the new home directory. Bash will cd to it on login, so make sure it exists and the permissions are correct. In addition, don't forget about .bashrc, .profile, .xinitrc, etc; if they're not in the home directory, they will not be read.

From usermod:

Usage: usermod [options] LOGIN

Options:
  -c, --comment COMMENT         new value of the GECOS field
  -d, --home HOME_DIR           new home directory for the user account
  -e, --expiredate EXPIRE_DATE  set account expiration date to EXPIRE_DATE
  -f, --inactive INACTIVE       set password inactive after expiration
                                to INACTIVE
  -g, --gid GROUP               force use GROUP as new primary group
  -G, --groups GROUPS           new list of supplementary GROUPS
  -a, --append                  append the user to the supplemental GROUPS
                                mentioned by the -G option without removing
                                him/her from other groups
  -h, --help                    display this help message and exit
  -l, --login NEW_LOGIN         new value of the login name
  -L, --lock                    lock the user account
  -m, --move-home               move contents of the home directory to the
                                new location (use only with -d)
  -o, --non-unique              allow using duplicate (non-unique) UID
  -p, --password PASSWORD       use encrypted password for the new password
  -R, --root CHROOT_DIR         directory to chroot into
  -s, --shell SHELL             new login shell for the user account
  -u, --uid UID                 new UID for the user account
  -U, --unlock                  unlock the user account