![为什么Linux使用文件扩展名来决定打开文件的默认程序,尽管它与文件扩展名无关](https://linux22.com/image/84652/%E4%B8%BA%E4%BB%80%E4%B9%88Linux%E4%BD%BF%E7%94%A8%E6%96%87%E4%BB%B6%E6%89%A9%E5%B1%95%E5%90%8D%E6%9D%A5%E5%86%B3%E5%AE%9A%E6%89%93%E5%BC%80%E6%96%87%E4%BB%B6%E7%9A%84%E9%BB%98%E8%AE%A4%E7%A8%8B%E5%BA%8F%EF%BC%8C%E5%B0%BD%E7%AE%A1%E5%AE%83%E4%B8%8E%E6%96%87%E4%BB%B6%E6%89%A9%E5%B1%95%E5%90%8D%E6%97%A0%E5%85%B3.png)
我有一个文本文件 as-abc.text
其内容为Hi I'm a text file.
如果我双击打开该文件,则会在gedit
编辑器中打开该文件。
然而,如果我将文件重命名为abc.html
(不更改其任何内容),则默认情况下它将在 Chrome 中打开。
这种行为在 Windows 计算机上是可以接受的,因为 Windows 使用文件扩展名来识别文件类型。但据我所知,Linux 不需要文件扩展名。
那么为什么在 Linux 中更改文件扩展名会更改打开它的默认程序呢?
答案1
Linux不使用文件扩展名来决定如何打开文件,但Linux使用文件扩展名来决定如何打开文件。
这里的问题是“Linux”可以指定操作系统的不同部分,并且“打开文件”也可以表示不同的含义。
Linux 和 Windows 之间的区别在于它们处理应用程序文件和数据文件的方式。在 Windows 上,两者之间的界限是模糊的。有几种类型的可执行文件,它们由扩展名(.exe
、.bat
等)决定,但在大多数情况下,您可以“执行”任何文件(例如,通过在资源管理器中单击),并且这将执行关联的可执行文件使用该文件类型,其中文件类型完全由扩展名决定(因此执行.doc
文件可能会启动c:\Program Files\something or other\winword.exe
,执行.py
文件可能会启动Python解释器等)。
在Linux上,有一个独立于文件名的可执行文件的概念。可执行文件通常没有扩展名,因为它们是由用户输入的。文件的类型无关紧要,用户只想执行该文件。内核根据文件内容决定如何执行文件:它本身就知道一些文件类型,并且舍邦机制允许文件声明任何其他可执行文件作为其解释器。
另一方面,数据文件通常具有指示数据类型的扩展名。这里的总体想法是,数据类型并不与用于打开文件的应用程序同义。您可能想在 Okular、Evince、Xpdf、Acroread 或 Mupdf 等中查看 PDF。
然而,有许多工具允许打开数据文件,而无需显式指定要使用的应用程序。这些工具几乎完全根据文件扩展名做出决定。文件扩展名和文件内容是这些工具可以使用的唯一信息:Linux 不存储有关文件格式的任何元信息。因此,当您单击.pdf
文件管理器中的文件时(或者当您.pdf
在适当配置的 zsh 命令行上运行文件等)时,文件管理器会查阅数据库来查找文件的首选应用程序.pdf
。该数据库可以分为两部分,一部分将扩展与 MIME 类型相关联 ( /etc/mime.types
, ~/.local/share/mime
),另一部分将 MIME 类型与应用程序相关联 ( /etc/mailcap
,~/.local/share/applications
),但即便如此,原点也是延伸。虽然通常可以从文件内容中找出应用程序,但这会比较慢,而且并不总是可行(许多格式看起来就像文本文件,a.jar
是 的一种类型.zip
,等等)。
Linux 没有需要文件扩展名,它不使用它们来确定如何运行可执行文件,但它确实使用它们来确定使用哪个程序来打开数据文件。
¹该文件必须是本机可执行文件,shebang 可执行文件不能指向另一个 shebang 可执行文件,以避免潜在的无休止的递归。
答案2
桌面环境有自己的机制来确定在文件浏览器中选择文件时使用哪个应用程序打开哪个文件。这与底层的 unixoid 操作系统无关,在本例中是 Linux(指的是内核,也许还有核心库和实用程序),它仍然与扩展无关。
这种机制通常是基于扩展的,为了方便用户并遵循最小意外规则。 MIME 类型只是这里使用的一个抽象,用于将多个扩展名(例如, 等)分配给.htm
通用内容类型,然后用于确定您想要/可以对文件执行什么操作。因此,在桌面设置中,您可以为 MIME 类型分配扩展名,并为每种类型选择用于打开文件的应用程序。.html
.HTML
然而,当谈到可执行文件时,在 DOS 的旧时代,操作系统只能执行三种类型的文件,并且它决定了它们如何由扩展名解释:.bat
, .com
, .exe
。这个时代早已一去不复返了,其他操作系统(例如 Unix 及其所有后代)从未依赖于如此微妙的机制,而是总是有其他方法来决定是否以及如何执行文件。
这习俗使用扩展被发现有用、扩展并且仍在使用,但不是为了操作系统的目的,而是为了方便用户,而不必查看进入一个文件,其命名是something.sh
为了发现它可能包含的内容。然而,操作系统不依赖于此,但应用程序可能会这样做,并且脚本始终会这样做:
for file in *.html; do ...
答案3
正如其他人的回答:由程序(shell)选择使用什么程序来打开特定文件。
但做出选择的不仅仅是扩展名:在文件的开头通常有一个签名,用于标识格式。 [注意,这在几乎所有二进制程序中都很常见,而不仅仅是在 UNIX 派生格式上]。该程序file
(及其数据库)是破译文件类型的主要来源。