如果文件告诉操作系统其文件格式,那么操作系统默认如何选择打开该文件的应用程序?
在Windows中,关联是否存储在注册表中?
Linux如何选择打开文件的应用程序?
我过去经常使用Nautilus,但是现在我改用终端了。在终端中,我们总是必须明确指定打开文件的应用程序吗?默认情况下,哪个应用程序打开某个格式的文件的设置是否属于文件管理器(例如Nautilus),当我们住在终端中时这不是问题吗?
如果文件告诉操作系统其文件格式,那么操作系统默认如何选择打开该文件的应用程序?
在Windows中,关联是否存储在注册表中?
Linux如何选择打开文件的应用程序?
我过去经常使用Nautilus,但是现在我改用终端了。在终端中,我们总是必须明确指定打开文件的应用程序吗?默认情况下,哪个应用程序打开某个格式的文件的设置是否属于文件管理器(例如Nautilus),当我们住在终端中时这不是问题吗?
Answers:
可能有不同的机制来处理这些默认设置。但是,其他答案往往集中在完整的桌面环境上,每个桌面环境都有自己的机制。但是,这些并非总是安装在系统上(我经常使用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-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
进行的配置可能会重定向到您环境中的正确配置工具。
xdg-open
只是试图将两端融合在一起的组件之一。
在Wiki条目中,
基于Linux的GUI(例如KDE和GNOME)支持基于MIME类型的关联。例如,MIME类型text / plain将与文本编辑器关联。
另外,此答案还有更多详细信息。
文件管理器通常使用选项a和b的某种组合(例如,首先查看文件扩展名,如果未知(或文件没有扩展名),则查看其内容)。
文件的类型不作为元数据存储在常见的Linux文件系统中。
从这个答案中,我看到以下信息。
文件管理器(默认为Nautilus)使用文件的MIME类型来确定使用哪个程序打开文件。安装应用程序后,它可以指定可以打开的MIME类型,以及用于打开位于/ usr / share / applications中的.desktop文件中的文件的命令。这是用于菜单,桌面快捷方式等的文件。
文件没有告诉操作系统其文件格式,只有一个例外:
如果可执行文件以所谓的shebang行开头,例如
#! /usr/bin/perl
然后此行告诉Linux内核它应该以它开始/usr/bin/perl
(也就是说,它应该执行usr/bin/perl
并将文件作为参数,而不是执行此文件)。当然,这仅适用于忽略(或理解)诸如“ shebang”行的文件格式。
除此之外,操作系统本身对文件类型一无所知。但是,许多允许打开其他文件的程序都有自己的机制来决定使用哪个程序打开哪个文件。那可以是程序内部的列表(例如Firefox维护这样的列表),或者程序可以将其委托给桌面环境(对于Linux,其中有多个)。
通常,这些机制仅考虑文件名来决定文件的类型。电子邮件客户端和Web浏览器是一个例外,其中文件的类型通常由服务器明确指定/邮件中已声明。
该机制通常分为两步:
gnome-open
。我确定其他桌面环境也有类似的命令行工具。编辑:我只是注意到John WH Smith提供了一个独立于您的桌面环境的命令。
类似于MS-Windows。
它不是由OS完成的。它是由文件管理器(窗口系统的一部分)完成的。通常,文件名的最后一个点之后的.
部分用于做出决定。有一种方法可以在设置中设置它们,也可以在右键单击文件时进行设置。
因此,该文件不会告诉操作系统,该文件未处于活动状态,因此无法单独执行任何操作,但是文件管理器会查看文件名,文件管理器也可能会像file
实用程序一样查看文件内部。
shell32!ShellExecute()
,虽然SHELL32是Windows Shell中的一部分,它不是Windows资源管理器,这是一部分的默认文件管理器。
正如@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'
file.png
PNG,file.gif
则将PNG文件重命名为仍会打开图像查看器。如果您清空文件,它将在文本编辑器中打开。
我将尝试给出有关Unix系统如何处理文件的基本答案。正如其他人指出的那样,您对这个问题的措辞具有误导性,因为文件本身不会报告它们是什么类型,并且内核本身不会决定使用哪个应用程序。
在Unix和Windows操作系统中,文件被简单地构造为字节序列。从Tanenbaum的操作系统,第三版:
实际上,操作系统不知道或不在乎文件中的内容。它所看到的只是字节。任何含义都必须由用户级程序强加。
这就是为什么在桌面环境xdg-open
中使用它来确定用于打开特定文件类型的默认应用程序的原因。
在Unix系统上,文件区分普通文件和特殊文件。常规文件仅仅是用户数据,可以是文本文件(ASCII或Unicode编码)或二进制文件(可执行代码)。特殊文件是运行OS必不可少的文件。其中包括目录,链接,管道,套接字和设备文件。¹
这是惯例,文件名包含扩展以表明它们是什么类型的文件可能是如的* .c的C源代码,网页等从的Tanenbaum *。html的:
在某些系统(例如UNIX)中,文件扩展名只是约定,不能由操作系统强制执行。名为file.txt的文件可能是某种文本文件,但该名称更多的是提醒所有者,而不是将任何实际信息传达给计算机。另一方面,C编译器实际上可能坚持要求将要编译的文件以.c结尾,如果没有,则它可能拒绝编译它们。
如果保存或重命名文件时没有适当的扩展名,则该文件仍会保留相同的格式。这就是大多数文件管理器决定打开文件的应用程序的方式,以及为什么没有扩展名的大多数文件管理器都会提示用户“选择要用于打开该文件的程序:”。
最后,环境变量用于定义系统范围和用户级别的设置。例如,变量EDITOR
是用来处理文本例如,当指定要打开的文本编辑器vim
,nano
等等,这是进程如何知道哪个编辑器打开,编辑,当像git
提交信息。否则,您必须指定要使用的应用程序是正确的。请注意vim
,如果设置了设置,则会通过检查扩展名和检查文件内容来检测文件类型filetype on
,然后应用正确的语法突出显示,缩进等。²
TL; DR
总而言之,由用户级应用程序确定使用哪个程序打开特定文件类型,而不是OS本身。