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?
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 (same effect as ./)
~- $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.
Those are the home directories of the users. Try cd ~(your username), for example.
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.
those are users, check your /etc/passwd
cd ~username
takes you to that users home dir
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 ~-.
Tilde expansion in Bash:
http://bash-hackers.org/wiki/doku.php/syntax/expansion/tilde
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
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.
来源:https://stackoverflow.com/questions/998626/meaning-of-tilde-in-linux-bash-not-home-directory