sudo ls 在 Linux 上不显示隐藏文件

kir*_*gin 2 ls bsd coreutils history dot-files

今天我发现在 OS X 上sudo ls显示隐藏文件(即名称以 开头的文件.)。这让我感到非常惊讶,以至于我问了一个关于这种行为的问题,我仍然觉得有些奇怪和意外。

事实证明,这种行为可以追溯到1979 年的 2BSD

鉴于此,现在我想问以下问题。为什么ls在 Linux 上不这样做?
是否有一段时间ls在某些其他类型的 *nixes 上有这种行为?是否有任何文档、提交消息、电子邮件解释谁以及为什么决定根本不应该复制此功能,或者如果最初复制它应该删除它?

Kaz*_*Kaz 5

POSIX 标准说:

“除非明确引用、提供 -A 或 -a 选项,或者实现定义的条件导致写入它们,否则不得写出以 ( '.' ) 开头的文件名和任何相关信息。”

作为 root 显然不被认为是导致隐藏文件被 GNU Coreutils 实现写入的条件,该实现ls通常打包在 Linux 发行版中。

有充分的理由不让程序的行为受全局变量影响,例如哪个用户 ID 有效。以非 root 身份开发的脚本在以 root 身份运行时会改变行为。

隐藏以点开头的文件不是一种安全机制;它不应该连接到安全上下文。它隐藏了我们通常不想看到的东西,比如源文件中的.git目录.c或其他什么。如果您对其他用户的目录具有读取权限,则可以列出他们的隐藏文件。 点隐藏了预期存在且无趣的项目,而不是其存在旨在保密的项目。

带点目录项比其他...没有特殊的操作系统状态; 只是ls特别对待他们。

我刚试过 Solaris 10;它ls也没有这种行为。它不是一个普遍的“Unixism”,这就解释了为什么 POSIX 要求是这样表述的。