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?
Tilde expansion in Bash:
http://bash-hackers.org/wiki/doku.php/syntax/expansion/tilde
On my machine, because of the way I have things set up, doing:
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:
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:
That means the same as
~-
.