编辑:这是/programming/998626/含义-tilde-in-linux-bash-not-home-directory /的副本。我没有以重复形式结束此问题的声誉。
我指的不是~
主目录,而是这样的:
$ ls ~foo/bar
/some/mount/point/foo/bar
但是,如果我尝试使用不同的挂载点,例如:
$ mount | ag "/dev "
devfs on /dev (devfs, local, nobrowse)
$ ls /dev/stdin
/dev/stdin
$ ls ~stdin
zsh: no such user or named directory: stdin .
# bash has a similar error message:
ls: ~stdin: No such file or directory
~
在这种情况下,所谓的是什么?它是如何工作的?
编辑:基于以下一些评论的更多信息:
- 我可以证明这
foo
不是我系统上的用户名。 - 尝试自动完成时,
ls -lah ~
不会显示所有选项。即我能够cd ~qux
,当qux
没有显示在自动完成中。再次qux
不是我的系统中的用户。 - 如果重要的
/some/mount/point
是网络共享。 - 所有的细节都暗示了一些命名路径模型,这是路径扩展的Z外壳功能,但这在bash中也有效,显然不支持Z外壳的命名路径。
/some/mount/point
绝对不是我的主目录。 cd ~
带我去/Users/$username/
--matches$HOME
zsh
似乎也使用波浪号来指示命名目录。
bash -c "ls ~foo/bar"
)中使用-它没有命名目录。此外,即使在zsh中,如果检查env
,也看不到任何命名目录的建立。我在Mac OS上,我觉得这是OS X特有的功能
~foo
。取实际的字符串(不是示例foo
)并执行grep "actual username" /etc/passwd
。根据bash手册,~text
应该仅适用于可能的登录用户名(不一定意味着它实际上能够登录;例如对于系统用户而言~lp
)。在我所有的测试中,~string
对应的string
是用户名。
~foo
是用户的主目录foo
。如果未指定用户,则当前用户为默认用户。