Reputation: 16121
First off, I know that ~/
is the home directory. CDing to ~
or ~/
takes me to the home directory.
However, cd ~X
takes me to a special place, where X
seems to be anything.
In bash, if I hit "cd ~
" and hit tab, it shows a bunch of possible ~X
options like ~mail
and ~postgres
and ~ssh
. Going to those folders and doing a pwd
shows me that these folders are not in the home directory; they're all over the place.
They are not aliases. I've checked.
They're not env.
variables, or else they'd require a $
.
What is setting these links, and where can I find where these are being set?
Upvotes: 127
Views: 182169
Reputation: 30847
It's a Bash feature called "tilde expansion". It's a function of the shell, not the OS. You'll get different behavior with csh, for example.
To answer your question about where the information comes from: your home directory comes from the variable $HOME
(no matter what you store there), while other user's homes are retrieved real-time using getpwent()
. This function is usually controlled by NSS; so by default values are pulled out of /etc/passwd
, though it can be configured to retrieve the information using any source desired, such as NIS, LDAP or an SQL database.
Tilde expansion is more than home directory lookup. Here's a summary:
~ $HOME
~fred (freds home dir)
~+ $PWD (your current working directory)
~- $OLDPWD (your previous directory)
~1 `dirs +1`
~2 `dirs +2`
~-1 `dirs -1`
dirs
and ~1
, ~-1
, etc., are used in conjunction with pushd
and popd
.
Edited to add:
As Sean Bright pointed out in a comment, the baseline tilde behavior regarding home directories is codified as standard behavior for POSIX-compliant shells. Additionally, the wordexp() C API function is specified to implement this behavior. Though, obviously, use with caution.
Upvotes: 96
Reputation: 38206
Those are users. Check your /etc/passwd
.
cd ~username
takes you to that user's home directory.
Upvotes: 15
Reputation: 16097
It's possible you're seeing OpenDirectory/ActiveDirectory/LDAP users "automounted" into your home directory.
In *nix, ~
will resolve to your home directory. Likewise ~X
will resolve to 'user X'.
Similar to automount for directories, OpenDirectory/ActiveDirectory/LDAP is used in larger/corporate environments to automount user directories. These users may be actual people or they can be machine accounts created to provide various features.
If you type ~Tab you'll see a list of the users on your machine.
Upvotes: 0
Reputation: 16749
If you're using autofs
then the expansion might actually be coming from /etc/auto.home
(or similar for your distro). For example, my /etc/auto.master
looks like:
/home2 auto.home --timeout 60
and /etc/auto.home
looks like:
mgalgs -rw,noquota,intr space:/space/mgalgs
Upvotes: 1
Reputation: 74654
Those are the home directories of the users. Try cd ~(your username)
, for example.
Upvotes: 36
Reputation: 753585
On my machine, because of the way I have things set up, doing:
cd ~ # /work1/jleffler
cd ~jleffler # /u/jleffler
The first pays attention to the value of environment variable $HOME
; I deliberately set my $HOME
to a local file system instead of an NFS-mounted file system. The second reads from the password file (approximately; NIS complicates things a bit) and finds that the password file says my home directory is /u/jleffler
and changes to that directory.
The annoying stuff is that most software behaves as above (and the POSIX specification for the shell requires this behaviour). I use some software (and I don't have much choice about using it) that treats the information from the password file as the current value of $HOME, which is wrong.
Applying this to the question - as others have pointed out, 'cd ~x
' goes to the home directory of user 'x', and more generally, whenever tilde expansion is done, ~x
means the home directory of user 'x' (and it is an error if user 'x' does not exist).
It might be worth mentioning that:
cd ~- # Change to previous directory ($OLDPWD)
cd ~+ # Change to current directory ($PWD)
I can't immediately find a use for '~+
', unless you do some weird stuff with moving symlinks in the path leading to the current directory.
You can also do:
cd -
That means the same as ~-
.
Upvotes: 10
Reputation: 16525
Tilde expansion in Bash:
http://bash-hackers.org/wiki/doku.php/syntax/expansion/tilde
Upvotes: 5
Reputation: 120644
Are they the home directories of users in /etc/passwd
? Services like postgres, sendmail, apache, etc., create system users that have home directories just like normal users.
Upvotes: 19