使用“--color=auto|always”运行“ls”需要执行权限

使用“--color=auto|always”运行“ls”需要执行权限

ls尽管我有读取权限,但我已经彻底困惑了相当长的一段时间,只是简单地拒绝在某些地方工作。经过一番混乱之后,事实证明ls只要我使用 运行它就可以正常工作--color=never,但是一旦我使用autoalways,我就会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

相关内容