Как Linux выбирает, какое приложение открыть файл?


38

Если файл сообщает ОС свой формат файла, как ОС выбирает, какое приложение открыть по умолчанию?

В Windows хранится ли связь в таблице реестра?

Как Linux выбирает, какое приложение открыть файл?

Раньше я часто использовал Nautilus, но теперь перехожу на терминал. Правда ли, что в терминале мы всегда должны явно указывать, в каком приложении открывать файл? Принадлежат ли настройки какого приложения для открытия файла определенного формата по умолчанию файловому менеджеру (например, Nautilus), и это не проблема, когда мы живем в терминалах?


24
Linux - это просто ядро ​​ОС. Я полагаю, вы имеете в виду среду рабочего стола или файловый менеджер . Это, вероятно, будет отличаться для баз Android, ChromeOS, Linux (или не Linux), работающих под управлением KDE, Gnome, XFCE ... или других)
Стефан Шазелас

вероятно. Я не знаю, что делает работу. Я использую гном, но также хотел бы знать о целом.
Тим

Затем уточните ОС и среду рабочего стола и приложения. Вроде наутилус в Ubuntu 12.04 с «единством» рабочего стола.
Стефан Шазелас

(1) Я нахожусь под Ubuntu 12.04. Мой рабочий стол Gnome или "Unity"? (2) Раньше я часто использовал Наутилус, но теперь я перехожу на терминал. Правда ли, что в терминале мы всегда должны явно указывать, в каком приложении открывать файл? Принадлежат ли настройки какого приложения для открытия файла определенного формата по умолчанию файловому менеджеру (например, Nautilus), и это не проблема, когда мы живем в терминалах?
Тим

Ответы:


35

Могут быть разные механизмы для обработки этих настроек по умолчанию. Тем не менее, другие ответы, как правило, сосредоточены на полной среде рабочего стола, каждый из которых имеет свой собственный механизм. Тем не менее, они не всегда устанавливаются в системе (я часто использую 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.

В первом случае вам нужно будет выполнить настройку 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может быть перенаправлена ​​на соответствующий инструмент конфигурации в вашей среде.


11
В идеальном мире Gnome и KDE использовали настройки xdg для выбора приложения для открытия файла и предоставляли пользовательские интерфейсы для изменения параметров xdg. Тогда мы могли бы иметь только одну базу данных настроек вместо одной для каждого DE. Увы, xdg появился слишком поздно.
Joeytwiddle

2
В идеальном мире у вас не было бы трех DE.
Рассел Борогове

1
@RussellBorogove - тогда мы все должны перейти на Windows. Это идеальный мир.
don_crissti

@don_crissti Я думаю, что это больше означало «идеал для разработчика или администратора». Хотя было бы здорово предложить разнообразие для конечного пользователя, дизайнерам было бы намного проще (но не обязательно «лучше») сосредоточиться на одной системе. xdg-openэто только один из этих компонентов, которые пытаются объединить оба конца.
Джон У. Смит

1
@John - об админах и разработчиках различных приложений: согласны ... но разработчики из основной ветки разработки могут сделать очень много. В идеальном мире, вместо того, чтобы жаловаться на то или иное , мы все будем вносить свой вклад в проекты, такие как KDE, Gnome и т. Д., Чтобы улучшить удобство использования и интерактивность между DE. Если бы все мы (миллионы) приложили лишь небольшое усилие, все эти проблемы были бы решены в течение нескольких дней.
don_crissti

11

Из вики ,

Графические интерфейсы на основе Linux, такие как KDE и GNOME, поддерживают ассоциации на основе типов MIME. Например, MIME-тип text / plain будет связан с текстовым редактором.

Кроме того, этот ответ имеет больше деталей.

Файловый менеджер часто использует некоторую комбинацию параметров a и b (например, сначала посмотрите на расширение файла, если оно неизвестно (или у файла нет расширения), посмотрите на содержимое).

Тип файла не сохраняется как метаданные в распространенных файловых системах Linux.

Из этого ответа я вижу приведенную ниже информацию.

Файловый менеджер (по умолчанию Nautilus) использует MIME-тип файла, чтобы определить, с какой программой открыть его. Когда приложение установлено, оно может указывать, какие типы MIME оно может открывать, и команду, используемую для открытия файлов, в файле .desktop, который находится в / usr / share / Applications. Этот файл используется для меню, ярлыков на рабочем столе и т. Д.


1
У меня вопрос "учитывая тип формата файла", определяет, какое приложение открыть файл.
Тим

11

Файл не сообщает ОС свой формат файла, за одним исключением:

Если исполняемый файл начинается с так называемой строки Шебанга, например

#! /usr/bin/perl

затем эта строка сообщает ядру Linux, что его следует запустить /usr/bin/perl(то есть вместо того, чтобы выполнять этот файл, он должен выполняться usr/bin/perlи давать этот файл в качестве аргумента). Это, конечно, работает только с форматами файлов, которые игнорируют (или понимают) такую ​​строку.

Кроме этого, операционная система как таковая ничего не знает о типах файлов. Однако многие программы, которые позволяют открывать другие файлы, имеют свой собственный механизм, чтобы решить, какую программу использовать для открытия какого файла. Это может быть список внутри самой программы (например, Firefox поддерживает такой список), или программа может делегировать его в среду рабочего стола (из которых есть несколько для Linux).

Обычно эти механизмы учитывают только имя файла, чтобы определить тип файла; Исключением являются почтовые клиенты и веб-браузеры, где обычно тип файла явно задается сервером / указывается в письме.

Механизм обычно двухступенчатый:

  • Во-первых, по имени файла или предоставленной информации определите тип файла MIME (тип MIME - это стандартизированный, но расширяемый список типов файлов).
  • Во-вторых, из типа MIME определите, какую программу выполнять, обычно через своего рода реестр, поддерживаемый либо самой программой, либо средой рабочего стола, для которой была написана программа.

Спасибо. Правда ли, что в терминале мы всегда должны явно указывать, в каком приложении открывать файл (кроме скрипта с shebang)? Принадлежат ли настройки какого приложения для открытия файла определенного формата по умолчанию к файловому менеджеру (например, Nautilus), хотя это не проблема, когда мы живем в терминалах?
Тим

Если вы хотите использовать ассоциации Gnome из командной строки, вы можете использовать команду gnome-open. Я уверен, что есть аналогичные инструменты командной строки для других сред рабочего стола. Редактировать: я просто отмечаю, что Джон У. С. Смит дает команду, независимую от среды вашего рабочего стола.
celtschk

6
Исправление : строка shebang не является сообщением ядру; это сообщение в оболочку .
Казарк


2
Поскольку ссылка на реальный код на этой связанной странице, кажется, не работает сейчас, вот еще одна ссылка на код ядра, обрабатывающий строки shebang: lxr.free-electrons.com/source/fs/binfmt_script.c - конечно, вы могли бы также просто установите исходные коды ядра и посмотрите в файл.
celtschk

4

Это сделано аналогично MS-Windows.

Это не сделано ОС. Это делается файловым менеджером, частью системы управления окнами. Обычно часть имени файла после последней точки .используется для принятия решения. Есть способ установить их в настройках или при щелчке правой кнопкой мыши по файлу.

Таким образом, файл не сообщает ОС, файл не активен, поэтому сам по себе ничего не может сделать, но файловый менеджер просматривает имя файла, файловый менеджер также может заглянуть внутрь файла, как это fileделает утилита.


Возможно, в Windows это не делается файловым менеджером как таковым. Любое приложение может вызвать shell32!ShellExecute(), и хотя shell32 является частью Windows Shell, он не является частью Windows Explorer, который является файловым менеджером по умолчанию.
Руслан

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
Некоторые файловые менеджеры анализируют содержимое файла перед расширением имени файла (возможно, они даже всегда игнорируют расширение, не уверен). Например, в Dolphin KDE, если у вас есть изображения GIF, связанные с браузером, и PNG со средством просмотра изображений, переименование file.pngфайла PNG по- file.gifпрежнему будет открывать средство просмотра изображений. И если вы очистите файл, он откроется в текстовом редакторе.
Руслан

3

Я попытаюсь дать основной ответ относительно того, как системы Unix обрабатывают файлы. Как указывали другие, ваша формулировка вопроса вводит в заблуждение, поскольку сами файлы не сообщают, какого они типа, а само ядро ​​не решает, какие приложения использовать.

В операционных системах Unix и Windows файлы структурированы просто как последовательность байтов. Из Операционных систем Таненбаума , третье издание:

По сути, операционная система не знает и не заботится о том, что находится в файле. Все это видит байты. Любое значение должно быть наложено программами уровня пользователя.

Вот почему в среде рабочего стола xdg-openиспользуется для определения приложений по умолчанию для открытия определенных типов файлов.

В системе Unix файлы различаются между обычными и специальными файлами . Обычный файл - это просто пользовательские данные, которые могут быть либо текстовым файлом (кодировка ASCII или Unicode), либо двоичным (исполняемый код). Специальные файлы - это файлы, которые необходимы для работы ОС. К ним относятся каталоги, ссылки, каналы, сокеты и файлы устройств.¹

По соглашению имена файлов содержат расширения, указывающие, к какому типу файлов они могут относиться, например * .c для исходного кода C, * .html для веб-страниц и т. Д. От Tanenbaum:

В некоторых системах (например, UNIX) расширения файлов являются просто соглашениями и не применяются операционной системой. Файл с именем file.txt может быть своего рода текстовым файлом, но это имя больше напоминает владельцу, чем передает какую-либо фактическую информацию на компьютер. С другой стороны, компилятор C может фактически настаивать на том, чтобы файлы, которые он должен компилировать, заканчивался на .c, и он может отказаться от компиляции, если они этого не делают.

Если файл сохранен или переименован без надлежащего расширения, он все равно сохраняет тот же формат для этого типа файла. Именно так большинство файловых менеджеров решают, с какими приложениями открывать файлы, и почему без расширения большинство будет предлагать пользователю «Выберите программу, которую вы хотите использовать для открытия этого файла:».

Наконец, переменные среды используются для определения общесистемных и пользовательских настроек. Например, переменная EDITORиспользуется для указания, какой текстовый редактор открывать при обработке текста, например vim, nanoи т. Д. Таким образом, процессы знают, какой редактор открывать, например, при редактировании gitсообщения фиксации. В противном случае вы правы, указав, какое приложение использовать. Обратите внимание, что vimобнаруживает типы файлов путем проверки расширений и проверки содержимого файла, если установлен параметр filetype on, который затем применяет правильную подсветку синтаксиса, отступы и т. Д. ²

TL; DR

Итак, приложения уровня пользователя определяют, с какими программами открывать файл определенного типа, а не саму ОС.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.