How can I change my Cygwin home folder after installation?
Starting with Cygwin 1.7.34, the recommended way to do this is to add a custom db_home
setting to /etc/nsswitch.conf
. A common wish when doing this is to make your Cygwin home directory equal to your Windows user profile directory. This setting will do that:
db_home: windows
Or, equivalently:
db_home: /%H
You need to use the latter form if you want some variation on this scheme, such as to segregate your Cygwin home files into a subdirectory of your Windows user profile directory:
db_home: /%H/cygwin
There are several other alternative schemes for the windows
option plus several other %
tokens you can use instead of %H
or in addition to it. See the nsswitch.conf
syntax description in the Cygwin User Guide for details.
If you installed Cygwin prior to 1.7.34 or have run its mkpasswd
utility so that you have an /etc/passwd
file, you can change your Cygwin home directory by editing your user's entry in that file. Your home directory is the second-to-last element on your user's line in /etc/passwd
.¹
Whichever way you do it, this causes the HOME
environment variable to be set during shell startup.²
See this FAQ item for more on the topic.
Footnotes:
Consider moving
/etc/passwd
and/etc/group
out of the way in order to use the new SAM/AD-based mechanism instead.While it is possible to simply set
%HOME%
via the Control Panel, it is officially discouraged. Not only does it unceremoniously override the above mechanisms, it doesn't always work, such as when running shell scripts viacron
.
Cygwin 1.7.34+
For those using Cygwin 1.7.34 or higher Cygwin supports configuring how to fetch home directory, login shell, and gecos information in /etc/nsswitch.conf
. This is detailed in the Cygwin User Guide section:
- Cygwin user names, home dirs, login shells
If you've previously created an /etc/passwd
or /etc/group
file you'll want to remove those and configure Cygwin using the new Windows Security model to POSIX mappings.
[[ -f /etc/passwd ]] && mv /etc/passwd /etc/passwd.bak
[[ -f /etc/group ]] && mv /etc/group /etc/group.bak
The /etc/nsswitch.conf
file's db_home:
setting defines how Cygwin fetches the user's home directory. The default setting for db_home:
is
db_home: /home/%U
So by default, Cygwin just sets the home dir to /home/$USERNAME
. You can change that though to point at any other custom path you want. The supported wildcard characters are:
-
%u
The Cygwin username (that's lowercase u). -
%U
The Windows username (that's uppercase U). -
%D
Windows domain in NetBIOS style. -
%H
Windows home directory in POSIX style. Note that, for thedb_home:
setting, this only makes sense right after the preceeding slash, as indb_home: /%H/cygwin
-
%_
Since space and TAB characters are used to separate the schemata, a space in the filename has to be given as%_
(that's an underscore). -
%%
A per-cent character.
In place of a path, you can specify one of four named path schemata that are predefined.
windows
The user's home directory is set to the same directory which is used as Windows home directory, typically something along the lines of%USERPROFILE%
orC:\Users\$USERNAME
. Of course, the Windows directory is converted to POSIX-style by Cygwin.cygwin
AD only: The user's home directory is set to the POSIX path given in the cygwinHome attribute from the cygwinUser auxiliary class. See also the section called “The cygwin schema”.unix
AD only: The user's home directory is set to the POSIX path given in the unixHomeDirectory attribute from the posixAccount auxiliary class. See also the section called “The unix schema”.desc
The user's home directory is set to the POSIX path given in the home="..." XML-alike setting in the user's description attribute in SAM or AD. See the section called “The desc schema” for a detailed description.
The following will make the user's home directory in Cygwin the same as is used for the Windows home directory.
db_home: windows
Cygwin 1.7.33 or earlier
For those using Cygwin 1.7.33 or earlier, update to the latest version Cygwin and remove previously used /etc/passwd
and /etc/group
files, then see the steps above.
Else, follow these older steps below.
Firstly, set a Windows environment variable for HOME that points to your user profile:
- Open System on the Control Panel
- On the Advanced tab click Environment Variables (toward the bottom)
- In the User Variables area click "New…"
- For Variable name enter
HOME
- For Variable value enter
%USERPROFILE%
- Click OK in all the open dialog boxes to apply this new setting
Now we are going to update the Cygwin /etc/passwd
file with the Windows %HOME%
variable we just created. Shell logins and remote logins via ssh
will rely on /etc/passwd
to tell them the location of the user's $HOME
path.
At the Cygwin bash command prompt type the following:
cp /etc/passwd /etc/passwd.bak
mkpasswd -l -p $(cygpath -H) > /etc/passwd
mkpasswd -d -p $(cygpath -H) >> /etc/passwd
The -d
switch tells mkpasswd to include DOMAIN users, while -l
is to only output LOCAL machine users. This is important if you're using a PC at work where the user information is obtained from a Windows Domain Controller.
Now, you can also do the same for groups, though this is not necessary unless you will be using a computer that is part of a Windows Domain. Cygwin reads group information from the Windows account databases, but you can add an /etc/group
file if your machine is often disconnected from its Domain Controller.
At the Cygwin bash prompt type the following:
cp /etc/group /etc/group.bak
mkgroup -l > /etc/group
mkgroup -d >> /etc/group
Now, exit Cygwin and start it up again. You should find that your HOME path points to the same location as your Windows User Profile -- i.e. /cygdrive/c/Users/username