可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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?
回答1:
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
.
回答2:
Those are the home directories of the users. Try cd ~(your username)
, for example.
回答3:
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.
回答4:
those are users, check your /etc/passwd
cd ~username
takes you to that users home dir
回答5:
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 ~-
.
回答6:
Tilde expansion in Bash:
http://bash-hackers.org/wiki/doku.php/syntax/expansion/tilde
回答7:
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
回答8:
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.