为什么Linux使用文件扩展名来决定打开文件的默认程序,尽管它与文件扩展名无关

Shi*_*wal 7 filesystems filenames files file-opening

我有一个文本文件 as-abc.text其内容为Hi I'm a text file.

如果我双击打开该文件,则会在gedit编辑器中打开该文件。

然而,如果我将文件重命名为abc.html(不更改其任何内容),则默认情况下它将在 Chrome 中打开。

这种行为在 Windows 计算机上是可以接受的,因为 Windows 使用文件扩展名来识别文件类型。但据我所知,Linux 不需要文件扩展名。

那么为什么在 Linux 中更改文件扩展名会更改打开它的默认程序呢?

Gil*_*il' 9

Linux 不使用文件扩展名来决定如何打开文件,但 Linux 使用文件扩展名来决定如何打开文件。

\n\n

这里的问题是 \xe2\x80\x9cLinux\xe2\x80\x9d 可以指定操作系统的不同部分,而 \xe2\x80\x9c 打开文件\xe2\x80\x9d 也可以表示不同的东西。

\n\n

Linux 和 Windows 之间的区别在于它们处理应用程序文件和数据文件的方式。在 Windows 上,两者之间的界限是模糊的。有几种类型的可执行文件,它们由其扩展名(.exe.bat等)决定,但在大多数情况下,您可以 \xe2\x80\x9c 执行\xe2\x80\x9d 任何文件(例如,通过在资源管理器中单击) ,并且这会执行与该文件类型关联的可执行文件,其中文件类型完全由扩展名决定(因此执行文件.doc可能会启动c:\\Program Files\\something or other\\winword.exe,执行.py文件可能会启动Python解释器等)。

\n\n

在Linux上,有一个独立于文件名的可执行文件的概念。可执行文件通常没有扩展名,因为它们是由用户输入的。文件的类型无关紧要,用户只想执行该文件。内核根据文件内容决定如何执行该文件:它本身就知道一些文件类型,并且shebang机制允许文件声明任何其他可执行文件\xc2\xb9 作为其解释器。

\n\n

另一方面,数据文件通常具有指示数据类型的扩展名。这里的总体想法是,数据类型并不与用于打开文件的应用程序同义。您可能想在 Okular、Evince、Xpdf、Acroread 或 Mupdf 等中查看 PDF。

\n\n

然而,有许多工具允许打开数据文件,而无需显式指定要使用的应用程序。这些工具几乎完全根据文件扩展名做出决定。文件扩展名和文件内容是这些工具可以使用的唯一信息:Linux 不存储有关文件格式的任何元信息。因此,当您单击.pdf文件管理器中的文件时(或者当您.pdf在适当配置的 zsh 命令行上运行文件等)时,文件管理器会查阅数据库来查找.pdf文件的首选应用程序。该数据库可以分为两部分,一部分将扩展与 MIME 类型 ( /etc/mime.types, ~/.local/share/mime) 相关联,另一部分将 MIME 类型与应用程序 ( /etc/mailcap, ~/.local/share/applications) 相关联,但即使如此,起源也是扩展。虽然通常可以从文件内容中找出应用程序,但这会比较慢,而且并不总是可能(许多格式看起来就像文本文件,a.jar是一种类型).zip,等等)。

\n\n

Linux 不需要文件扩展名,也不使用它们来确定如何运行可执行文件,但它确实使用它们来确定使用哪个程序来打开数据文件。

\n\n

\xc2\xb9该文件必须是本机可执行文件,shebang 可执行文件不能指向另一个 shebang 可执行文件,以避免潜在的无休止的递归。

\n