在OS X上〜的意外Bash完成


13

我按~TabTab了bash命令提示符,得到了意外的完成情况。

首先,它看起来像/Users目录中的所有人一样,还有更多。

然后,我认为它正在对带有“ home”目录的人们进行反向查找/etc/password,或者也许是/var/empty-这似乎是正确的。

我很好奇是什么真正回事,为什么这个作品它。

Answers:


21

我没有要检查的OSX系统,但是在所有* nixes上,这~foo是user主目录的简写foo。例如,此命令将移入我用户的目录$HOMEcd ~仅移入您的主目录):

cd ~terdon

因此,~Tab将扩大到所有可能的用户名。该列表应与中的用户列表相同/etc/passwd

我可以确认,这确实是我在Debian上尝试此操作时发生的情况。


在FreeBSD上尝试时是相同的。
珍妮D

所以让我感到震惊的是,我在/ home中没有这些用户的目录。实际上,很多人说/ var / empty。我认为这种完成是通过磁盘查找来完成的,因此〜将查找磁盘上的实际主目录而不是/ etc / passwd条目。因为〜的实际含义是“用户的主目录”,而不是/ home(或/ User)的快捷方式,所以在OS X情况下,扩展引用/ var / empty。学到新东西!谢谢!
Walt Stoneburner 2015年

@WaltStoneburner fdo在下面的回答表明,我不知道OSX在做些不同的事情。无论如何,在Linux上,在中创建目录/home都是不相关的,不会列出新的用户名。另外,请注意,并非所有用户的$ HOME都位于/home(或/Users)中。
terdon

@terdon-我想您已经用答案将其钉上了。在我的Linux帐户上,我有一个dovenull用户,该用户的伪造目录为/ nonexistent,该目录显示在自动补全中,但是cd命令失败(如预期的那样)。
Walt Stoneburner

2

我以为是在/ etc / password中用“ home”目录对人们进行反向查找。

在OS X上,将查询Open Directory而不是/ etc / passwd。


1

Bash参考手册

Bash尝试完成将文本视为用户名的操作(如果文本以“〜”开头)

Bash 使用 getpwent函数来完成。

man getpwent 在OSX上说:

这些函数从opendirectoryd(8)获取信息,包括/etc/master.passwd中的记录,这些记录在master.passwd(5)中进行了描述。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.