在 OS X 上,为什么 `sudo ls` 显示隐藏(点)文件?

kir*_*gin 161 bsd ls macos

使用 OS X Yosemite,使用以下命令,我得到以下信息:

$ touch .a
$ touch b
$ /bin/ls
b
$ /bin/ls -A
.a  b
$ sudo /bin/ls
.a  b
Run Code Online (Sandbox Code Playgroud)

它在被 root 调用时显示隐藏文件(名称以点开头),而在以普通用户身份运行时不显示它们(如预期)。这与lsLinux(来自coreutils)上的不同。

为什么会ls这样?

kir*_*gin 404

事实证明,此功能不是 Apple 特有的。这通常是 BSD 系统的一个特性。

/* Root is -A automatically. */
if (!getuid())
    f_listdot = 1;
Run Code Online (Sandbox Code Playgroud)

最初,我能够将其追溯到4.4BSD-Lite的来源。它已经存在于1994 年的FreeBSD 提交中,它正在导入这些源。

该功能也存在于 OpenBSD 中,可以在1995 年的提交中找到,声称从 NetBSD 导入代码,所以这已经存在于NetBSD 中

然后发现 1993 年的 NetBSD 提交声称从386BSD导入代码,并且该功能已经存在。此外,这个提交表明它在 1991 年 386BSD 0.0 版的开发过程中存在,据我所知,该版本从 BSD 4.3 左右分叉出来。

该评论在4.3BSD-Reno的开发过程中第一次出现在这个名为“新 ls 的第一个工作版本”的提交(1989 年 6 月 27 日)中。原评论说:

/* root sees all files automatically */
Run Code Online (Sandbox Code Playgroud)

当天晚些时候将更改为(不过,我不确定此存储库中的时间戳是否完全正确):

/* root is -A automatically */
Run Code Online (Sandbox Code Playgroud)

仅在 1992 年才添加了大写字母和句号将评论变成了我们现在所拥有的:

/* Root is -A automatically. */
Run Code Online (Sandbox Code Playgroud)

但是该行为在 1979 年 5 月 9 日出现在 2BSD 中,如下面的快照所示

Aflg = getuid() == 0;
Run Code Online (Sandbox Code Playgroud)

我找不到那个时代的任何实际历史,但也有1977 年 1BSD 的快照没有这些行。而且-A实际上没有国旗。

因此,该功能似乎是在 1977 年 11 月(当时正在开发 1BSD)和 1979 年 5 月发布 2BSD 之间的某个时间引入的。


我在这次调查中还发现了 2005 年添加到 FreeBSD 以覆盖此行为的-I标志,在稍后重新设计

  • 此外,可能值得注意的是,通过以 `.` 开头来隐藏文件的“功能”是一个简单的错误 - `ls` 只应该隐藏 `.` 目录,而不是所有以 `.` 开头的目录。快进几十年,它通常用于隐藏危险文件等,同时也用于隐藏系统配置等 - 因此让管理员看到这些文件(用于维护配置或查找隐藏的恶意软件等)是有意义的。 . (52认同)
  • Luaan 评论的参考:https://plus.google.com/+RobPikeTheHuman/posts/R58WgWwN9jp(其中 Rob Pike 解释说隐藏“点文件”开始是一个错误)。 (23认同)
  • 史诗般的答案。历史学到了! (3认同)
  • 来自 POSIX Rationale,“当超级用户在不指定 -a 选项的情况下调用 ls 时,ls 实用程序的某些历史实现会显示目录中除 dot 和 dot-dot 之外的所有条目。当“普通”用户在不指定 -a 的情况下调用 ls 时,他们不应看到任何名称以 <句号> 开头的文件的信息,除非它们被命名为文件操作数。” http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html (2认同)

fd0*_*fd0 15

这是源代码的链接。注意/* Root is -A automatically. */。这是 Apple 版本的 BSD 中的一个特性ls

  • 嗯,[看起来像](http://lists.freebsd.org/pipermail/freebsd-bugs/2007-March/022861.html) 这不是苹果特有的功能,但它来自 BSD 世界? (5认同)
  • 是的,它不是 Apple 特有的。谢谢你的回答,它让我走上了正轨。我使用“Root is -A automatic”字符串来搜索线索。 (2认同)