使用OS X Yosemite,使用以下命令,我得到以下信息:
$ touch .a
$ touch b
$ /bin/ls
b
$ /bin/ls -A
.a b
$ sudo /bin/ls
.a b
由root调用时,它显示隐藏文件(名称以点开头),而以普通用户身份运行时,则不显示它们(按预期)。这与ls
Linux(来自的coreutils
)不同。
为什么这样ls
行事?
BSD
和OSX
更合适的位置。
使用OS X Yosemite,使用以下命令,我得到以下信息:
$ touch .a
$ touch b
$ /bin/ls
b
$ /bin/ls -A
.a b
$ sudo /bin/ls
.a b
由root调用时,它显示隐藏文件(名称以点开头),而以普通用户身份运行时,则不显示它们(按预期)。这与ls
Linux(来自的coreutils
)不同。
为什么这样ls
行事?
BSD
和OSX
更合适的位置。
Answers:
事实证明,此功能不是Apple特有的。通常,这是BSD系统的功能。
/* Root is -A automatically. */
if (!getuid())
f_listdot = 1;
最初,我能够将其追溯到4.4BSD-Lite的源。从1994年开始的FreeBSD承诺中就已经存在了,该承诺正在导入这些资源。
该功能也存在于OpenBSD中,可以在1995年的一次提交中找到,该声明声称是从NetBSD导入代码,因此该功能已经存在于NetBSD中。
然后人们发现NetBSD从1993年开始提交的声明声称是从386BSD导入代码,并且该功能已经存在。而且,此提交表明,在1991年的386BSD 0.0版的开发过程中,就在我看来,它是在4.3左右从BSD分叉的。
该注释是在4.3BSD-Reno的开发过程中第一次出现在此提交中(1989年6月27日),标题为“新ls的第一个工作版本”。原始评论说:
/* root sees all files automatically */
这是后来改的那一天(我不知道时间标记在这个仓库完全正确的,虽然)到:
/* root is -A automatically */
仅在1992年,添加了大写字母和句点,使注释变成了现在的样子:
/* Root is -A automatically. */
但是从快照可以看出,该行为在1979年5月9日出现在2BSD中:
Aflg = getuid() == 0;
我当时找不到任何实际的历史记录,但是也有这张 1977年的1BSD 快照,没有这些内容。而且-A
实际上没有国旗。
因此,该功能似乎是在1977年11月(当时正在开发1BSD)和1979年5月2BSD发行之间引入的。
.
是一个简单的错误- ls
仅应隐藏.
目录,而不是以文件开头的所有内容.
。快进几十年,它通常用于隐藏危险文件等,同时也用于隐藏系统配置等。因此,让管理员查看这些文件(维护配置或查找隐藏的恶意软件等)是有意义的。 。
这是源代码的链接。注意/* Root is -A automatically. */
。这是Apple的BSD版本中的功能ls
。
Root is -A automatically
字符串搜索线索。