Como o Linux escolhe qual aplicativo abrir um arquivo?

38

Se um arquivo informa ao SO seu formato de arquivo, como o SO escolhe qual aplicativo abrir por padrão?

No Windows, a associação é armazenada na tabela de registro?

Como o Linux escolhe qual aplicativo abrir um arquivo?

Eu costumava usar muito o Nautilus, mas agora mudo para terminal. É verdade que no terminal, sempre temos que especificar explicitamente qual aplicativo abrir um arquivo? As configurações de qual aplicativo abrir um arquivo de um determinado formato por padrão pertencem ao gerenciador de arquivos (por exemplo, Nautilus) e não é um problema quando estamos morando em terminais?

    
por Tim 07.08.2014 / 18:03

6 respostas

35

Pode haver mecanismos diferentes para lidar com essas configurações padrão. No entanto, outras respostas tendem a se concentrar em ambientes de desktop completos, cada um deles com seu próprio mecanismo. No entanto, eles nem sempre são instalados em um sistema (uso muito o OpenBox) e, nesse caso, ferramentas como xdg-open podem ser usadas.

Citando o Arch Wiki :

xdg-open is a desktop-independent tool for configuring the default applications of a user. Many applications invoke the xdg-open command internally.

Neste momento, estou usando o Ubuntu (12.04) e xdg-open está disponível. No entanto, quando você usa um ambiente de área de trabalho completo como o GNOME, xdg-open atua como um encaminhador simples e retransmite as solicitações de arquivo para o DE, que fica livre para manipulá-lo como quiser (consulte outras respostas para GNOME e Nautilus, por exemplo).

Inside a desktop environment (e.g. GNOME, KDE, or Xfce), xdg-open simply passes the arguments to that desktop environment's file-opener application (gvfs-open, kde-open, or exo-open, respectively), which means that the associations are left up to the desktop environment.

... que traz de volta as outras respostas nesse caso. Ainda assim, uma vez que este é o Unix & Linux, e não Ask Ubuntu:

When no desktop environment is detected (for example when one runs a standalone window manager, e.g. Openbox), xdg-open will use its own configuration files.

Ao todo:

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

Se o primeiro caso, você precisará configurar xdg-open diretamente , usando o comando xdg-mime (que também permitirá que você veja qual aplicativo deve manipular qual arquivo). No segundo caso ...

                        |-- GNOME? > gvfs-open handles the request.
                        |
Info. from xdg-open > --|-- KDE?   > kde-open handles the request.
                        |
                        |-- XFCE?  > exo-open handles the request.

... você precisará configurar o abridor de arquivos associado ao seu ambiente de área de trabalho. Em alguns casos, a configuração feita por xdg-mime pode ser redirecionada para a ferramenta de configuração adequada em seu ambiente.

    
por 07.08.2014 / 18:31
11

Na entrada wiki ,

Linux-based GUIs, such as KDE and GNOME, support MIME type-based associations. For example, the MIME type text/plain would be associated with a text editor.

Além disso, esta resposta tem mais detalhes.

File manager often use some combination of option a and b (e.g. look at the file extension first, if it's not known (or the file does not have an extension), look at the contents).

A file's type is not stored as metadata on common linux file systems.

De esta resposta, vejo as informações abaixo.

The file manager (Nautilus, by default) uses the MIME type of a file to determine which program to open it with. When an application is installed, it can specify what MIME types it can open and the command to use to open the files in the .desktop file which is placed in /usr/share/applications. This is the file used for menus, desktop shortcuts, etc.

    
por 07.08.2014 / 18:17
11

Um arquivo não informa ao SO seu formato de arquivo, com uma exceção:

Se um arquivo executável começar com uma chamada linha shebang, como

#! /usr/bin/perl

então esta linha diz ao kernel do Linux que ele deve ser iniciado com /usr/bin/perl (ou seja, em vez de executar este arquivo, ele deve executar usr/bin/perl e fornecer este arquivo como argumento). É claro que isso só funciona com formatos de arquivo que ignoram (ou entendem) tal linha de shebang.

Além disso, o sistema operacional não sabe nada sobre os tipos de arquivo. No entanto, muitos programas que permitem abrir outros arquivos têm seu próprio mecanismo para decidir qual programa usar para abrir o arquivo. Isso pode ser uma lista dentro do próprio programa (o Firefox, por exemplo, mantém tal lista), ou o programa pode delegá-lo ao ambiente de desktop (dos quais existem vários para o Linux).

Normalmente, esses mecanismos consideram apenas o nome do arquivo para decidir o tipo de arquivo; uma exceção são os clientes de e-mail e os navegadores da web, em que geralmente o tipo do arquivo é fornecido explicitamente pelo servidor / declarado no e-mail.

O mecanismo geralmente é em duas etapas:

  • Primeiro, a partir do nome do arquivo ou das informações fornecidas, determine o tipo MIME do arquivo (o tipo MIME é uma lista padronizada, mas extensível de tipos de arquivo).
  • Em segundo lugar, a partir do tipo MIME, determine qual programa executar, geralmente por meio de um tipo de registro mantido pelo próprio programa ou pelo ambiente de área de trabalho para o qual o programa foi gravado.
por 07.08.2014 / 18:20
4

É feito de forma semelhante ao MS-Windows.

Isso não é feito pelo sistema operacional. Isso é feito pelo gerenciador de arquivos, uma parte do sistema de janelas. Normalmente, a parte do nome do arquivo após o último ponto . é usada para fazer o decisão. Existe uma maneira de defini-los nas configurações ou quando você clica com o botão direito do mouse em um arquivo.

Portanto, o arquivo não informa ao SO, o arquivo não está ativo, portanto, ele não pode fazer nada sozinho, mas o gerenciador de arquivos examina o nome do arquivo, o gerenciador de arquivos também pode procurar dentro do arquivo como file utility faz.

    
por 07.08.2014 / 18:11
3

Como @richard diz, é semelhante ao Windows. Um gerenciador de arquivos genérico pode olhar primeiro o nome de um arquivo e tentar reconhecer uma extensão de arquivo associada a um programa. Se isso falhar, pode tentar abrir o arquivo e procurar por um cabeçalho. Se você tentar ler um arquivo que não seja de texto (digamos, um .jpeg), verá uma sequência de dados que descreve o arquivo. Por exemplo, esta é a primeira linha de um .jpeg que eu tinha por aí:

'\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'

    
por 07.08.2014 / 18:24
3

Eu tentarei dar uma resposta básica de como os sistemas Unix lidam com arquivos. Como outros apontaram, sua formulação da pergunta é enganosa, uma vez que os próprios arquivos não relatam de que tipo são e o próprio kernel não decide quais aplicativos usar.

Nos sistemas operacionais Unix e Windows, os arquivos são estruturados simplesmente como uma seqüência de bytes. Dos sistemas operacionais de Tanenbaum, terceira edição:

In effect, the operating system does not know or care what is in the file. All it sees are bytes. Any meaning must be imposed by user-level programs.

É por isso que, em um ambiente de área de trabalho, xdg-open é usado para determinar aplicativos padrão para abrir tipos de arquivos específicos.

Em um sistema Unix, os arquivos são diferenciados entre arquivos regulares e arquivos especiais . Um arquivo regular é apenas um dado do usuário, que pode ser um arquivo de texto (codificação ASCII ou Unicode) ou binário (código executável). Arquivos especiais são arquivos essenciais para a execução do sistema operacional. Estes incluem diretórios, links, pipes, soquetes e arquivos de dispositivos. ¹

É por convenção que os nomes dos arquivos contêm extensões para indicar que tipo de arquivo eles podem ser, por exemplo, * .c para código-fonte C, * .html para páginas web, etc. De Tanenbaum:

In some systems (e.g., UNIX), file extensions are just conventions and are not enforced by the operating system. A file named file.txt might be some kind of text file, but that name is more to remind the owner than to convey any actual information to the computer. On the other hand, a C compiler may actually insist that files it is to compile end in .c, and it may refuse to compile them if they do not.

Se um arquivo for salvo ou renomeado sem a extensão adequada, ele ainda manterá o mesmo formato para esse tipo de arquivo. É assim que a maioria dos gerenciadores de arquivos decide com quais aplicativos abrir arquivos, e por que sem a extensão a maioria irá solicitar ao usuário "Escolha o programa que você deseja usar para abrir este arquivo:".

Por fim, as variáveis de ambiente são usadas para definir configurações em todo o sistema e em nível de usuário. Por exemplo, a variável EDITOR é usada para especificar qual editor de texto abrir ao manusear texto, por ex. vim , nano , etc. É assim que os processos sabem qual editor abrir, como ao editar uma mensagem git commit. Caso contrário, você está correto em especificar o aplicativo a ser usado. Observe que vim detecta tipos de arquivos verificando extensões e inspecionando o conteúdo do arquivo, se a configuração filetype on estiver definida, que então aplica o realce de sintaxe correto, recuo, etc. ²

TL; DR

Em resumo, são os aplicativos de nível de usuário que determinam com quais programas abrir um tipo de arquivo específico, e não o próprio sistema operacional.

    
por 10.08.2014 / 22:08