使用 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
这样表现?
答案1
事实证明,此功能并非 Apple 独有。这是 BSD 系统的普遍功能。
/* Root is -A automatically. */
if (!getuid())
f_listdot = 1;
最初,我能够追溯到4.4BSD-精简版。它已经存在于这个 FreeBSD 提交从 1994 年开始进口这些来源。
该功能也存在于 OpenBSD 中,可以在这次提交从 1995 年开始,声称从 NetBSD 导入代码,所以这在网络BSD。
然后人们发现 1993 年 NetBSD 的提交声称正在从386BSD,并且该功能已经那里。 此外,这次提交据我所知,这表明它在 1991 年开发 386BSD 版本 0.0 时就已存在,该版本从 BSD 4.3 左右分叉而来。
该评论首次出现在4.3BSD-里诺在这次提交(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 发布之间某个时间推出的。
答案2
以下是一条链接源代码。注意/* Root is -A automatically. */
。这是 Apple 版本的 BSD 的一个特性ls
。
答案3
我记得在 Usenet 早期(80 年代初期)曾有一个关于此问题的帖子。该功能是作为安全预防措施添加的,以便恶意用户无法轻易向系统管理员/root 隐藏文件/目录/可执行文件。该理论基本上是“root 可以访问所有内容,因此它应该能够看到所有内容”。