Meaning of tilde in Linux bash (not home directory)

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?

165781 次浏览

它们是 /etc/passwd中用户的主目录吗?诸如 postgres、 sendmail、 apache 等服务创建的系统用户和普通用户一样拥有主目录。

这些是用户的主目录。

那些是用户,检查你的 /etc/passwd

cd ~username将您带到该用户的主目录。

在我的机器上,因为我的设置方式:

cd ~             # /work1/jleffler
cd ~jleffler     # /u/jleffler

第一个环境变量注意到了 $HOME的价值,我故意将我的 $HOME设置为本地文件系统,而不是 NFS 挂载的文件系统。第二个读取密码文件(大约,NIS 有点复杂) ,发现密码文件说我的主目录是 /u/jleffler,并改变到该目录。

恼人的是大多数软件的行为如上所述(shell 的 POSIX 规范要求这种行为)。我使用一些软件(我没有太多的选择使用它) ,将密码文件中的信息作为 $HOME 的当前值,这是错误的。

把这个应用到这个问题上——正如其他人所指出的,‘ cd ~x’到用户‘ x’的主目录,更一般地说,每当波浪展开完成时,~x就表示用户‘ x’的主目录(如果用户‘ x’不存在,那就是一个错误)。


值得一提的是:

cd ~-       # Change to previous directory ($OLDPWD)
cd ~+       # Change to current directory ($PWD)

我不能立即找到一个使用“ ~+”,除非你做了一些奇怪的东西与移动符号链接的路径通向工作目录。

You can also do:

cd -

意思和 ~-一样。

这是 Bash 的一个特性,叫做“ 波动膨胀”。这是 shell 的功能,不是操作系统的。例如,使用 csh 会得到不同的行为。

为了回答您关于信息来自哪里的问题: 您的主目录来自变量 $HOME(不管您在那里存储什么) ,而其他用户的主目录则使用 getpwent()实时检索。这个函数通常由 国家安全局控制,因此默认情况下,值是从 /etc/passwd中提取出来的,尽管它可以配置为使用所需的任何源(如 NIS、 LDAP 或 SQL 数据库)来检索信息。

波浪扩展不仅仅是主目录查找。下面是一个总结:

~              $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:

正如 肖恩 · 布莱特在一篇评论中指出的,关于主目录的基线波浪线行为被编码为 POSIX-compliant shell 的标准行为。此外,还指定了 Wordexp ()CAPI 函数来实现此行为。不过,显然要小心使用。

如果您使用的是 autofs,那么扩展可能实际上来自于 /etc/auto.home(或类似于您的发行版)。例如,我的 /etc/auto.master看起来像:

/home2 auto.home --timeout 60

/etc/auto.home看起来像:

mgalgs -rw,noquota,intr space:/space/mgalgs

您可能会看到 OpenDirectory/ActiveDirectory/LDAP 用户“自动”进入您的主目录。

在 * nix 中,~将解析为您的主目录,同样地,~X将解析为‘ user X’。

与目录的自动加载类似,OpenDirectory/ActiveDirectory/LDAP 在较大/企业环境中用于自动加载用户目录。这些用户可以是实际的人,也可以是创建来提供各种特性的机器帐户。

如果键入 ~Tab,您将看到计算机上的用户列表。