文件扩展名以及与 linux 程序的关联

Cra*_*lus 2 executable filenames file-opening

在 Windows 中,我们可以将文件的扩展名与程序相关联。
例如,由于扩展名,文件test.pl可以由安装的Perl解释器运行pl
在 linux 中,虽然它需要#!/usr/bin/perl作为第一行。
这是因为在 Linux 中文件扩展名和程序之间没有关联吗?

Baa*_*rud 7

不,不是那个意思。如果您有一个设置了执行权限的文本文件(例如chmod a+x somefile),并且文件的第一行类似于

"#!/path/to/executable"
Run Code Online (Sandbox Code Playgroud)

它只是告诉 Unix 使用什么程序来执行脚本。如果文本文件被标记为可执行文件(即脚本),Unix 将启动以这种方式指定的任何程序,并将文本文件的其余部分(脚本)发送给该程序。通常,指定的程序将是一个 shell(/bin/sh/bin/csh/bin/bash)、某种编程语言(Perl、Python 或 Ruby)的解释器或其他一些执行脚本的程序(如文本操纵器 Awk 或 Sed)。

通常在许多语言中“#”指定注释,仅当第一行以“#!”开头时 这很特别。如果一个文件被标记为可执行文件但不以“#!”开头,Unix 将假定它是某种二进制文件(例如,由 C 编译器和链接器生成的 ELF 可执行文件)。

一般来说,Unix 不依赖于文件的后缀。许多程序既不需要也不需要自动添加它们的典型后缀,一个例外是压缩程序(如gzipbzip2),它通常用压缩文件替换原始文件,添加后缀以标记压缩类型(这些是少数几个程序之一)抱怨不正确的后缀)。

相反,文件是通过一系列测试通过其内容来识别的,寻找“魔术数字”和其他标识符(您可以file在某些文件上尝试该命令来测试这一点)。GNOME 和 KDE 下的文件浏览器也使用它来选择图标和程序列表以打开/编辑文件。在这里,文件的 MIME 类型由此类测试识别,然后从与 MIME 类型关联的列表中找到适合查看和编辑的程序 - 而不是 Windows 中的后缀。

由于其中一个测试是检查文本文件的第一行是否为“#!/something”,然后查看“something”是什么;例如,您可以说#!/usr/bin/perl将该文件标识为 perl 脚本 - 但这更多的是副作用。即使文件不以“#!”开头,测试也应该能够正确识别文件。在任何情况下,用于标识它的是文件的内容,而不是任意的后缀。因此,像 .pl (Perl) 和 .awk (Awk) 这样的结尾纯粹是为了帮助人类用户识别文件类型,Unix 不会使用它来确定类型(如 Windows 中的后缀)。

您实际上可以制作一个没有“#!/something”的“脚本”,但 Unix 无法将它作为可执行文件自动运行(它不知道在哪个程序中运行脚本)。相反,您必须“手动”以类似perl myscript或的方式启动它python myscript。大型 Python 和 Perl 应用程序中的许多脚本实际上不会以“#!/something”开头,因为它们是“内部使用”的脚本,不打算由用户直接调用。

相反,您将启动主脚本(它确实以“#!/something”开头),然后它会在此脚本运行时将这些其他脚本传递给解释器。