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


38

如果文件告诉操作系统其文件格式,那么操作系统默认如何选择打开该文件的应用程序?

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

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

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


24
Linux只是OS内核。我想您的意思是您的桌面环境文件管理器。这很可能将是在Android,Chrome操作系统,Linux操作系统(或者非Linux)操作系统基地运行KDE,GNOME,XFCE ......或其他)不同
斯特凡Chazelas

大概。我不知道是哪个工作。我正在使用gnome,但也想了解一般情况。
2014年

然后阐明操作系统和桌面环境及应用程序。就像Ubuntu 12.04中带有“统一”桌面的nautilus。
斯特凡Chazelas

(1)我在Ubuntu 12.04下。我的桌面是Gnome还是“ Unity”?(2)我以前经常使用Nautilus,但是现在我改用了Terminal。在终端中,我们总是必须明确指定打开文件的应用程序吗?默认情况下,哪个应用程序打开某个格式文件的设置是否属于文件管理器(例如Nautilus),当我们住在终端中时这不是问题吗?
蒂姆(Tim)

Answers:


35

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

引用Arch Wiki

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,所以不要问Ubuntu:

如果未检测到桌面环境(例如,运行独立的窗口管理器,例如Openbox),则xdg-open将使用其自己的配置文件。

总而言之:

                            |-- no desktop env. > handle directly.
User Request > xdg-open > --|
                            |-- desktop env.    > pass information to the DE.

如果是第一种情况,则需要使用命令直接进行配置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.

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


11
在理想情况下,Gnome和KDE将使用xdg设置来选择要打开文件的应用,并提供UI来更改xdg选项。这样,我们可能只有一个设置数据库,而不是每个DE都有一个。las xdg出现为时已晚。
joeytwiddle

2
在理想的世界中,您将没有三个DE。
罗素·博罗戈夫

1
@RussellBorogove-然后我们都应该转到Windows。这是一个理想的世界。
don_crissti 2015年

@don_crissti我认为这更像是“开发人员或管理员的理想之选”。为最终用户提供多样性是一件很了不起的事情,但对于设计师来说,专注于单个系统确实要容易得多(但不一定“更好”)。xdg-open只是试图将两端融合在一起的组件之一。
约翰·史密斯

1
@John-关于管理员和各种应用程序开发人员/设计师:同意...但是,上游开发人员只能做很多事情。在理想的世界中,我们都会为上游项目(如KDE,Gnome等)做出贡献,以提高DE之间的可用性和可重复性,而不是为此抱怨或抱怨。如果我们所有人(数百万人)仅付出很小的努力,那么所有这些问题将在几天内得到解决。
don_crissti 2015年

11

Wiki条目中,

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

另外,答案还有更多详细信息。

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

文件的类型不作为元数据存储在常见的Linux文件系统中。

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

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


1
我的问题是“给定文件的格式类型”,确定打开该文件的应用程序。
蒂姆(Tim)

11

文件没有告诉操作系统其文件格式,只有一个例外:

如果可执行文件以所谓的shebang行开头,例如

#! /usr/bin/perl

然后此行告诉Linux内核它应该以它开始/usr/bin/perl(也就是说,它应该执行usr/bin/perl并将文件作为参数,而不是执行此文件)。当然,这仅适用于忽略(或理解)诸如“ shebang”行的文件格式。

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

通常,这些机制仅考虑文件名来决定文件的类型。电子邮件客户端和Web浏览器是一个例外,其中文件的类型通常由服务器明确指定/邮件中已声明。

该机制通常分为两步:

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

谢谢。在终端中,我们总是必须明确指定打开文件的应用程序(带有shebang的脚本除外)吗?默认情况下,哪个应用程序打开某个格式文件的设置是否属于文件管理器(例如Nautilus),而当我们生活在终端中时这不是问题吗?
蒂姆(Tim)

如果要从命令行使用Gnome关联,则可以使用命令gnome-open。我确定其他桌面环境也有类似的命令行工具。编辑:我只是注意到John WH Smith提供了一个独立于您的桌面环境的命令。
celtschk 2014年

6
更正:shebang行不是发给内核的消息;这是给外壳的消息。
卡扎尔克2014年


2
由于指向该链接页面中的实际代码的链接现在似乎无法正常工作,因此下面是指向处理shebang行的内核代码的另一个链接:lxr.free-electrons.com/source/fs/binfmt_script.c —当然,您也可以只需自己安装内核源代码并查看文件即可。
celtschk 2014年

4

类似于MS-Windows。

它不是由OS完成的。它是由文件管理器(窗口系统的一部分)完成的。通常,文件名的最后一个点之后的.部分用于做出决定。有一种方法可以在设置中设置它们,也可以在右键单击文件时进行设置。

因此,该文件不会告诉操作系统,该文件未处于活动状态,因此无法单独执行任何操作,但是文件管理器会查看文件名,文件管理器也可能会像file实用程序一样查看文件内部。


可以说,在Windows中,它不是文件管理器本身完成的。任何应用程序可以调用shell32!ShellExecute(),虽然SHELL32是Windows Shell中的一部分,它不是Windows资源管理器,这是一部分默认文件管理器。
Ruslan 2014年

3

正如@richard所说,它类似于Windows。通用文件管理器可能会先查看文件名,然后尝试识别与程序关联的文件扩展名。如果失败,它可能会尝试打开文件并寻找标题。如果您尝试读取非文本文件(例如.jpeg),则会看到描述该文件的数据字符串。例如,这是我躺在的.jpeg的第一行:

'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xfe\x00;CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), quality = 90'


2
一些文件管理器在文件名扩展名之前分析文件内容(也许他们甚至总是忽略扩展名,不确定)。例如,在KDE的Dolphin中,如果您有与浏览器关联的GIF图像和带有图像查看器的file.pngPNG,file.gif则将PNG文件重命名为仍会打开图像查看器。如果您清空文件,它将在文本编辑器中打开。
Ruslan 2014年

3

我将尝试给出有关Unix系统如何处理文件的基本答案。正如其他人指出的那样,您对这个问题的措辞具有误导性,因为文件本身不会报告它们是什么类型,并且内核本身不会决定使用哪个应用程序。

在Unix和Windows操作系统中,文件被简单地构造为字节序列。从Tanenbaum的操作系统,第三版:

实际上,操作系统不知道或不在乎文件中的内容。它所看到的只是字节。任何含义都必须由用户级程序强加。

这就是为什么在桌面环境xdg-open中使用它来确定用于打开特定文件类型的默认应用程序的原因。

在Unix系统上,文件区分普通文件特殊文件。常规文件仅仅是用户数据,可以是文本文件(ASCII或Unicode编码)或二进制文件(可执行代码)。特殊文件是运行OS必不可少的文件。其中包括目录,链接,管道,套接字和设备文件。¹

这是惯例,文件名包含扩展以表明它们是什么类型的文件可能是如的* .c的C源代码,网页等从的Tanenbaum *。html的:

在某些系统(例如UNIX)中,文件扩展名只是约定,不能由操作系统强制执行。名为file.txt的文件可能是某种文本文件,但该名称更多的是提醒所有者,而不是将任何实际信息传达给计算机。另一方面,C编译器实际上可能坚持要求将要编译的文件以.c结尾,如果没有,则它可能拒绝编译它们。

如果保存或重命名文件时没有适当的扩展名,则该文件仍会保留相同的格式。这就是大多数文件管理器决定打开文件的应用程序的方式,以及为什么没有扩展名的大多数文件管理器都会提示用户“选择要用于打开该文件的程序:”。

最后,环境变量用于定义系统范围和用户级别的设置。例如,变量EDITOR是用来处理文本例如,当指定要打开的文本编辑器vimnano等等,这是进程如何知道哪个编辑器打开,编辑,当像git提交信息。否则,您必须指定要使用的应用程序是正确的。请注意vim,如果设置了设置,则会通过检查扩展名和检查文件内容来检测文件类型filetype on,然后应用正确的语法突出显示,缩进等。²

TL; DR

总而言之,由用户级应用程序确定使用哪个程序打开特定文件类型,而不是OS本身。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.