这是在 Mac 上,但我认为这是 Unixy 问题。
我刚刚分叉了一个 Github 存储库(这个)并将其克隆到 USB 记忆棒(制作存储库的设备附带的 USB 记忆棒)。在ls
ing 后,我注意到 README.md 以红色突出。果然,它的权限是:
-rwxrwxrwx 1 me staff 133B 15 Jun 08:59 README.md*
我尝试跑步chmod 644 README.md
,但没有任何变化。这里发生了什么?
答案1
因为文件的“可执行性”是 UNIX 系统上文件条目的属性,而不是像 Windows 上的文件类型的属性。
简而言之,ls
如果任何所有者、组或每个人都具有该文件的执行权限,则将文件列为可执行文件。它不关心文件类型是什么,只关心权限是什么。这种行为有两个显着的好处:
- 您无需执行任何特殊操作即可处理新的可执行格式。这对于脚本语言特别有用,您可以在
#!
文件顶部用一行嵌入解释器。内核不必知道.py
文件是可执行的,因为权限告诉它这一点。当与 Linux 上的支持相结合时,这也binfmt_misc
使得可以做一些非常巧妙的事情,例如如果您安装了 Wine,则将 Windows 控制台程序视为本机二进制文件。 - 它可以让您说某些从技术上来说是机器代码的文件不能或不应该被执行。这也主要与脚本语言一起使用,在脚本语言中,具有在文件格式形式可执行文件方面无法区分的库并不罕见。因此,使用上面的 python 示例,您可以说人们不应该能够直接运行 Python 标准库中的任意模块,即使它们具有扩展名
.py
。
然而,如果您遇到不支持 POSIX 权限的文件系统(例如 FAT)(如果您没有设置用户映射,则为 NTFS),这一切都会崩溃。如果文件系统不存储 POSIX 权限,则操作系统必须模拟它们。在 Linux 上,默认情况下为每个人设置读写和执行权限,以便用户可以对文件执行他们想要的操作。如果没有这个,您将无法从 USB 闪存驱动器执行脚本或二进制文件,因为内核不允许您修改每个文件对此类文件系统的权限。
在您的特定情况下,git
存储它在提交时在文件上看到的属性,并且 README.md 文件的原始提交(或其后续提交之一)可能发生在 Windows 系统上,其中处理此类事情非常不同,因此git
只是将权限存储为每个人的完全访问权限,类似于 Linux 在没有权限支持的情况下处理 fiesystems 的方式。