我知道当我运行命令时
chmod +x filename
bash 将使我的文件成为可执行文件。文件的体系结构究竟发生了什么变化,才将其更改为可执行文件?即内核如何知道此文件是可执行文件?
只是想锻炼我的书呆子肌肉。
答案1
文件的“架构”没有改变– 您需要确保其格式正确。也就是说,文件已经需要是一个有效的 ELF 二进制文件,或者是一个带有有效#!
标头的脚本,或者是您的特定内核识别的其他内容(例如 a.out 或 MZ/PE)。
它chmod
的作用只是在文件权限中设置一个位,告诉内核用户允许执行此文件。它可以充当一个小的安全屏障,并防止某些类型的事故。(请注意,+x
这里是 的简写ugo+x
;它就像读/写一样是权限位。)
如果您在内核无法识别的文件上设置 +x,它只会从exec
系统调用返回错误代码。(请注意,某些 shell 对此有特殊处理 - 如果内核报告“无法识别的格式”,shell 将尝试将文件解释为脚本内部,因为之前的 shellscript 就是这样工作#!
的发明。
答案2
文件的内容根本不会改变。为典型的 Unix 设计的文件系统将支持存储有关每个文件的信息。这通常称为文件的“元数据”。
这就是为什么您无法在某些文件系统上获得类似的结果。也就是说,FAT 没有用于存储与 Unix 权限相关的数据的内置空间,而 Unix 通常会在挂载此类文件系统卷时使用特殊参数来解决这个问题。因此,通常 FAT 驱动器上的所有文件都具有相同的权限,如挂载所指定。(我希望其他文件系统(如 ISO9660)也有类似的行为,尽管这通常是不可写的。)在以这种方式挂载的卷上,使用chmod +x
实际上不会改变任何东西。
简而言之,内核通过检查文件系统驱动程序来了解这一点。对于为 unix 设计的典型文件系统,该驱动程序支持读取存储 Unix 样式权限的位置。
chmod 只是改变驱动器上的那些位置。