如果一个文件告诉操作系统它的文件格式,那么操作系统如何选择默认使用哪个应用程序打开它?
在Windows中,关联存储在注册表中吗?
Linux 如何选择哪个应用程序来打开文件?
我以前经常使用Nautilus,但现在我改用终端。在终端中,我们是否总是必须显式指定哪个应用程序打开文件?默认情况下使用哪个应用程序打开某种格式的文件的设置是否属于文件管理器(例如Nautilus),而当我们生活在终端中时这不是问题?
答案1
可能有不同的机制来处理这些默认设置。然而,其他答案往往关注完整的桌面环境,每个环境都有自己的机制。然而,这些并不总是安装在系统上(我经常使用 OpenBox),在这种情况下,xdg-open
可以使用诸如此类的工具。
引用拱门维基:
xdg-open 是一个独立于桌面的工具,用于配置用户的默认应用程序。许多应用程序在内部调用 xdg-open 命令。
目前,我使用的是 Ubuntu (12.04) 并且xdg-open
可用。然而,当您使用完整的桌面环境(例如 GNOME)时,xdg-open
它充当一个简单的转发器,并将文件请求转发到您的 DE,然后 DE 可以根据需要自由处理它(例如,请参阅 GNOME 和 Nautilus 的其他答案) 。
在桌面环境(例如 GNOME、KDE 或 Xfce)内,xdg-open 只是将参数传递给该桌面环境的文件打开器应用程序(分别为 gvfs-open、kde-open 或 exo-open),这意味着关联由桌面环境决定。
...这会让您回到这种情况下的其他答案。不过,由于这是 Unix 和 Linux,而不是 Ask Ubuntu:
当未检测到桌面环境时(例如,当运行独立的窗口管理器,例如 Openbox 时),xdg-open 将使用自己的配置文件。
总而言之:
|-- no desktop env. > handle directly.
User Request > xdg-open > --|
|-- desktop env. > pass information to the DE.
如果是第一种情况,您需要xdg-open
直接配置,使用该xdg-mime
命令(这还允许您查看哪个应用程序应该处理哪个文件)。在第二种情况...
|-- GNOME? > gvfs-open handles the request.
|
Info. from xdg-open > --|-- KDE? > kde-open handles the request.
|
|-- XFCE? > exo-open handles the request.
...您需要配置与您的桌面环境关联的文件打开器。在某些情况下,通过进行的配置xdg-mime
可能会重定向到您环境中正确的配置工具。
答案2
来自维基百科入口,
基于 Linux 的 GUI(例如 KDE 和 GNOME)支持基于 MIME 类型的关联。例如,MIME 类型 text/plain 将与文本编辑器相关联。
还,这答案有更多细节。
文件管理器经常使用选项a和b的某种组合(例如,首先查看文件扩展名,如果未知(或文件没有扩展名),则查看内容)。
文件类型不会作为元数据存储在常见的 Linux 文件系统上。
从这回答,我看到下面的信息。
文件管理器(默认情况下为 Nautilus)使用文件的 MIME 类型来确定使用哪个程序打开该文件。安装应用程序时,它可以指定可以打开的 MIME 类型以及用于打开位于 /usr/share/applications 中的 .desktop 文件中的文件的命令。这是用于菜单、桌面快捷方式等的文件。
答案3
文件不会告诉操作系统其文件格式,但有一个例外:
如果可执行文件以所谓的 shebang 行开头,例如
#! /usr/bin/perl
那么这一行告诉 Linux 内核它应该启动/usr/bin/perl
(也就是说,它应该执行usr/bin/perl
并给出这个文件作为参数,而不是执行这个文件)。当然,这只适用于忽略(或理解)这样的 shebang 行的文件格式。
除此之外,操作系统本身对文件类型一无所知。然而,许多允许打开其他文件的程序都有自己的机制来决定使用哪个程序打开哪个文件。这可以是程序本身内部的列表(例如 Firefox 维护这样的列表),或者程序可以将其委托给桌面环境(其中有几个适用于 Linux)。
通常,这些机制只考虑文件名来决定文件的类型;电子邮件客户端和 Web 浏览器是一个例外,其中文件的类型通常由服务器明确给出/在邮件中说明。
该机制通常分为两步:
- 首先,根据文件名或提供的信息,确定文件的 MIME 类型(MIME 类型是标准化但可扩展的文件类型列表)。
- 其次,根据 MIME 类型,确定要执行哪个程序,通常是通过程序本身或程序编写的桌面环境维护的某种注册表。
答案4
我将尝试给出 Unix 系统如何处理文件的基本答案。正如其他人指出的那样,您对问题的措辞具有误导性,因为文件本身不报告它们的类型,并且内核本身不决定使用哪些应用程序。
在 Unix 和 Windows 操作系统中,文件的结构简单地为字节序列。来自塔南鲍姆操作系统, 第三版:
实际上,操作系统不知道也不关心文件中的内容。它看到的只是字节。任何意义都必须由用户级程序强加。
这就是为什么在桌面环境中,xdg-open
用于确定打开特定文件类型的默认应用程序。
在 Unix 系统上,文件区分为常规文件和特殊文件。常规文件仅仅是用户数据,可以是文本文件(ASCII 或 Unicode 编码)或二进制文件(可执行代码)。特殊文件是运行操作系统所必需的文件。其中包括目录、链接、管道、套接字和设备文件。^
按照惯例,文件名包含扩展名以指示它们的文件类型可能例如,*.c 表示 C 源代码,*.html 表示网页等。来自 Tanenbaum:
在某些系统(例如UNIX)中,文件扩展名只是约定,并不由操作系统强制执行。名为 file.txt 的文件可能是某种文本文件,但该名称更多的是为了提醒所有者,而不是向计算机传达任何实际信息。另一方面,C 编译器实际上可能坚持要编译的文件以 .c 结尾,如果不是,它可能会拒绝编译它们。
如果文件在没有正确扩展名的情况下保存或重命名,它仍保留该文件类型的相同格式。这就是大多数文件管理器决定使用哪些应用程序打开文件的方式,以及为什么如果没有扩展名,大多数文件管理器会提示用户“选择要用来打开此文件的程序:”。
最后,环境变量用于定义系统范围和用户级别的设置。例如,该变量EDITOR
用于指定在处理文本(例如 、 等)时要打开哪个文本编辑器。vim
这nano
就是进程如何知道要打开哪个编辑器的方式,例如在编辑git
提交消息时。否则,您必须指定要使用哪个应用程序,这是正确的。请注意,vim
如果设置了设置,则通过检查扩展名和检查文件内容来检测文件类型,filetype on
然后应用正确的语法突出显示、缩进等。²
长话短说
总之,是用户级应用程序决定使用哪些程序打开特定文件类型,而不是操作系统本身。