Linux 如何选择打开文件的应用程序?

Tim*_*Tim 39 files file-opening

如果一个文件告诉操作系统它的文件格式,操作系统如何选择默认打开它的应用程序?

在 Windows 中,关联是否存储在注册表中?

Linux 如何选择打开文件的应用程序?

我以前经常使用 Nautilus,但现在我改用终端了。在终端中,我们总是必须明确指定要打开文件的应用程序,这是真的吗?哪个应用程序默认打开某种格式的文件的设置是否属于文件管理器(例如Nautilus),在我们生活在终端时不是问题吗?

Joh*_*ith 36

可能有不同的机制来处理这些默认设置。但是,其他答案往往侧重于完整的桌面环境,每个环境都有自己的机制。然而,这些并不总是安装在系统上(我经常使用 OpenBox),在这种情况下,xdg-open可能会使用诸如此类的工具。

引用Arch Wiki

xdg-open 是一个独立于桌面的工具,用于配置用户的默认应用程序。许多应用程序在内部调用 xdg-open 命令。

目前,我正在使用 Ubuntu (12.04) 并且xdg-open可用。但是,当您使用完整的桌面环境(例如 GNOME)时,它会xdg-open充当简单的转发器,并将文件请求中继到您的 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.
Run Code Online (Sandbox Code Playgroud)

如果是第一种情况,您需要使用命令直接配置xdg-openxdg-mime(这也将允许您查看哪个应用程序应该处理哪个文件)。在第二种情况...

                        |-- GNOME? > gvfs-open handles the request.
                        |
Info. from xdg-open > --|-- KDE?   > kde-open handles the request.
                        |
                        |-- XFCE?  > exo-open handles the request.
Run Code Online (Sandbox Code Playgroud)

...您需要配置与您的桌面环境相关联的文件打开器。在某些情况下,通过xdg-mime进行的配置可能会重定向到您环境中的正确配置工具。

  • 在理想的世界中,Gnome 和 KDE 将使用 xdg 设置来选择打开文件的应用程序,并提供 UI 来更改 xdg 选项。然后我们可以只有一个设置数据库,而不是每个 DE 一个。唉xdg出现的太晚了。 (11认同)
  • 在理想的世界中,您不会拥有三个 DE。 (2认同)

Ram*_*esh 11

维基条目,

基于 Linux 的 GUI,例如 KDE 和 GNOME,支持基于 MIME 类型的关联。例如,MIME 类型 text/plain 将与文本编辑器相关联。

此外,这个答案有更多细节。

文件管理器经常使用选项 a 和 b 的某种组合(例如,首先查看文件扩展名,如果不知道(或文件没有扩展名),则查看内容)。

文件的类型不会作为元数据存储在常见的 linux 文件系统上。

这个答案中,我看到了以下信息。

文件管理器(默认为 Nautilus)使用文件的 MIME 类型来确定使用哪个程序打开它。安装应用程序时,它可以指定可以打开的 MIME 类型以及用于打开位于 /usr/share/applications 中的 .desktop 文件中的文件的命令。这是用于菜单、桌面快捷方式等的文件。


cel*_*chk 11

文件不会告诉操作系统它的文件格式,只有一个例外:

如果一个可执行文件以所谓的 shebang 行开头,比如

#! /usr/bin/perl
Run Code Online (Sandbox Code Playgroud)

然后这一行告诉 Linux 内核它应该被启动/usr/bin/perl(也就是说,它应该执行usr/bin/perl并给出这个文件作为参数,而不是执行这个文件)。这当然只适用于忽略(或理解)这样的 shebang 行的文件格式。

除此之外,操作系统本身对文件类型一无所知。然而,许多允许打开其他文件的程序都有自己的机制来决定使用哪个程序打开哪个文件。这可以是程序本身内部的列表(例如 Firefox 维护这样的列表),或者程序可以将其委托给桌面环境(其中有几个适用于 Linux)。

通常,这些机制只考虑文件名来决定文件是什么类型;一个例外是电子邮件客户端和网络浏览器,其中文件的类型通常由服务器明确指定/在邮件中说明。

该机制通常分为两步:

  • 首先,根据文件名或提供的信息,确定文件的 MIME 类型(MIME 类型是标准化但可扩展的文件类型列表)。
  • 其次,根据 MIME 类型,确定要执行的程序,通常通过由程序本身或程序编写的桌面环境维护的一种注册表。

  • **更正**:shebang 行_不是_向内核发送消息;这是给_shell_ 的消息。 (6认同)
  • 由于该链接页面中实际代码的链接现在似乎不起作用,这里是内核代码处理 shebang 行的另一个链接:http://lxr.free-electrons.com/source/fs/binfmt_script.c — of当然,您也可以自己安装内核源代码并查看文件。 (2认同)