ls
尽管我有读取权限,但我已经彻底困惑了相当长的一段时间,只是简单地拒绝在某些地方工作。经过一番混乱之后,事实证明ls
只要我使用 运行它就可以正常工作--color=never
,但是一旦我使用auto
或always
,我就会Permission denied
在缺乏执行权限的所有内容上收到熟悉的错误。
是什么原因导致这种情况以及如何在保持输出ls
颜色的同时阻止它?
更新:好的,终于弄清楚了(像往常一样,在寻求帮助后直接)。您需要执行权限才能进入目录,因此 cd 和 ls --color 在没有它的目录上不起作用。我不知道为什么我仍然可以在没有它的目录上使用 ls --color=never 。好奇这是为什么?
答案1
要查看目录的内容(条目的名称),只需要该目录的读取权限。
这意味着您可以/bin/ls
毫无问题地运行并查看所有名称。
但要决定名称应使用哪种颜色显示,ls
请使用条目中的其他属性。它使用文件中的元数据(权限、大小、文件类型等)。这要求它是stat()
文件,并且需要目录的执行权限才能成功。
只需目录中文件的名称:您只需要读取权限。对于目录中文件的元数据:您需要读取和执行权限
答案2
要仅列出目录中事物的名称,而不关心它们的类型(等),只需要对该目录的读取权限。
为了给目录中的内容分配颜色,ls
需要了解它们的相关信息——条目类型(另一个目录、纯文件、设备、符号链接等)、大小、符号链接目标;它通过条目上的各种系统调用找到这些内容。这需要+x
包含这些项目的目录的权限位。 (实际上,根据内核版本,您仍然可以获得一些颜色 -getdents
可以给出名称和类型)。
顺便说一句,我的版本ls
在吐出权限被拒绝错误后仍然列出目录(尽管是所有颜色)。如果你想看到其他奇怪的东西,请尝试-l
:
$ ls -l test 2>/dev/null
total 0
l????????? ? ? ? ? ? badsymlink
-????????? ? ? ? ? ? empty
p????????? ? ? ? ? ? fifo
l????????? ? ? ? ? ? goodsymlink
-????????? ? ? ? ? ? notempty