Como o Linux escolhe qual aplicativo abrir um arquivo?

38

Se um arquivo informa ao sistema operacional o formato do arquivo, como o sistema operacional 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 o terminal. É verdade que, no terminal, sempre precisamos 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 isso não é um problema quando moramos em terminais?

Tim
fonte
24
Linux é apenas o kernel do SO. Suponho que você esteja falando do seu ambiente de área de trabalho ou do seu gerenciador de arquivos aqui. Isso provavelmente vai ser diferente no Android, o ChromeOS, Linux (ou não-Linux) bases sistemas operacionais rodando KDE, Gnome, XFCE ... ou outro)
Stéphane Chazelas
provavelmente. Não sei qual é o trabalho. Estou usando o gnome, mas também gostaria de saber sobre geral.
Tim
Em seguida, esclareça o ambiente e o aplicativo OS e Desktop. Como nautilus no Ubuntu 12.04 com área de trabalho "unidade".
Stéphane Chazelas
(1) Estou no Ubuntu 12.04. O meu desktop é Gnome ou "Unidade"? (2) Eu costumava usar muito o Nautilus, mas agora mudo para terminal. É verdade que, no terminal, sempre precisamos 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 isso não é um problema quando moramos em terminais?
Tim

Respostas:

35

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

Citando o Arch Wiki :

O xdg-open é uma ferramenta independente da área de trabalho para configurar os aplicativos padrão de um usuário. Muitos aplicativos chamam o comando xdg-open internamente.

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

Dentro de um ambiente de área de trabalho (por exemplo, GNOME, KDE ou Xfce), o xdg-open simplesmente passa os argumentos para o aplicativo abridor de arquivos do ambiente de área de trabalho (gvfs-open, kde-open ou exo-open, respectivamente), o que significa que o associações são deixadas para o ambiente de desktop.

... o que leva você de volta às outras respostas nesse caso. Ainda assim, como esse é Unix e Linux, e não o Ask Ubuntu:

Quando nenhum ambiente de área de trabalho é detectado (por exemplo, quando se executa um gerenciador de janelas independente, por exemplo, Openbox), o xdg-open usa seus próprios arquivos de configuração.

Contudo:

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

Se o primeiro caso, você precisará configurar xdg-opendiretamente , usando o xdg-mimecomando (que também permitirá que você veja qual aplicativo deve lidar com 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 xdg-mimepode ser redirecionada para a ferramenta de configuração adequada em seu ambiente.

John WH Smith
fonte
11
Em um mundo ideal, o Gnome e o KDE usariam as configurações do xdg para escolher qual aplicativo abrir um arquivo e forneceriam UIs para alterar as opções do xdg. Então poderíamos ter apenas um banco de dados de configurações, em vez de um para cada DE. Infelizmente, o xdg apareceu tarde demais.
Joeytwiddle
2
Em um mundo ideal, você não teria três DEs.
Russell Borogove 8/08/14
1
@RussellBorogove - todos nós devemos mudar para o Windows. É um mundo ideal.
don_crissti
@don_crissti Acho que isso era mais "ideal para um desenvolvedor ou administrador". Embora seja ótimo oferecer variedade a um usuário final, seria muito mais fácil (mas não necessariamente "melhor") para os designers se concentrarem em um único sistema. xdg-opené apenas um desses componentes que tenta reunir as duas extremidades.
John WH Smith
1
@ John - sobre administradores e vários aplicativos desenvolvedores / designers: concordou ... mas, em seguida, os desenvolvedores upstream podem fazer tanto. Em um mundo ideal, em vez de reclamarmos disso ou daquilo, todos nós contribuiríamos para projetos upstream como KDE, Gnome etc. para melhorar a usabilidade e a iteroperatividade entre DEs. Se todos nós (milhões) fizéssemos apenas um pequeno esforço, todos esses problemas seriam resolvidos em alguns dias.
don_crissti
11

Na entrada do wiki ,

GUIs baseadas em Linux, como KDE e GNOME, suportam associações baseadas em tipo MIME. Por exemplo, o tipo MIME text / plain seria associado a um editor de texto.

Além disso, esta resposta tem mais detalhes.

O gerenciador de arquivos geralmente usa alguma combinação das opções aeb (por exemplo, observe primeiro a extensão do arquivo, se ela não for conhecida (ou o arquivo não tiver extensão), verifique o conteúdo).

O tipo de arquivo não é armazenado como metadado em sistemas de arquivos linux comuns.

A partir desta resposta, vejo as informações abaixo.

O gerenciador de arquivos (Nautilus, por padrão) usa o tipo MIME de um arquivo para determinar com qual programa abri-lo. Quando um aplicativo é instalado, ele pode especificar quais tipos MIME ele pode abrir e o comando a ser usado para abrir os arquivos no arquivo .desktop, que é colocado em / usr / share / applications. Esse é o arquivo usado para menus, atalhos da área de trabalho etc.

Ramesh
fonte
1
Minha pergunta é "dado o tipo de formato de um arquivo", determina qual aplicativo abrir o arquivo.
Tim
11

Um arquivo não informa ao sistema operacional o formato do arquivo, com uma exceção:

Se um arquivo executável iniciar com a chamada linha shebang, como

#! /usr/bin/perl

então esta linha informa ao kernel do Linux que ele deve ser iniciado /usr/bin/perl(ou seja, em vez de executar este arquivo, ele deve executar usr/bin/perle fornecer esse arquivo como argumento). Obviamente, isso funciona apenas com formatos de arquivo que ignoram (ou entendem) essa linha shebang.

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

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

O mecanismo geralmente é de duas etapas:

  • Primeiro, no nome do arquivo ou nas informações fornecidas, determine o tipo MIME do arquivo (o tipo MIME é uma lista padronizada, mas extensível, de tipos de arquivo).
  • Segundo, do tipo MIME, determine para qual programa executar, geralmente através de um tipo de registro mantido pelo próprio programa ou pelo ambiente de área de trabalho para o qual o programa foi escrito.
celtschk
fonte
obrigado. É verdade que, no terminal, sempre precisamos especificar explicitamente qual aplicativo abrir um arquivo (exceto o script com shebang)? As configurações de qual aplicativo abrir um arquivo de um determinado formato por padrão pertencem ao gerenciador de arquivos (por exemplo, Nautilus), embora não seja um problema quando moramos em terminais?
Tim
Se você quiser usar as associações do Gnome a partir da linha de comando, você pode usar o comando gnome-open. Tenho certeza de que existem ferramentas de linha de comando semelhantes para os outros ambientes de área de trabalho. Edit: Acabei de notar que John WH Smith dá um comando que é independente do seu ambiente de trabalho.
Celtschk 7/08
6
Correção : a linha shebang não é uma mensagem para o kernel; é uma mensagem para o shell .
Kazark 7/08/14
1
@Kazark: coderwall.com/p/pdg77q
celtschk
2
Como o link para o código real nessa página vinculada parece não funcionar agora, aqui está outro link para o código do kernel que lida com as linhas shebang: lxr.free-electrons.com/source/fs/binfmt_script.c - é claro que você também pode basta instalar as fontes do kernel e verificar o arquivo.
Celtschk
4

É feito de forma semelhante ao MS-Windows.

Isso não é feito pelo sistema operacional. Isso é feito pelo gerenciador de arquivos, parte do sistema de janelas. Geralmente, a parte do nome do arquivo após o último ponto .é usada para tomar a 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 sistema operacional, o arquivo não está ativo e não pode fazer nada por si só, mas o gerenciador de arquivos analisa o nome do arquivo, o gerenciador de arquivos também pode procurar dentro do arquivo da mesma forma que o fileutilitário.

ctrl-alt-delor
fonte
Indiscutivelmente, no Windows, isso não é feito pelo gerenciador de arquivos em si. Qualquer aplicativo pode chamar shell32!ShellExecute()e, embora o shell32 faça parte do Windows Shell, ele não faz parte do Windows Explorer, que é o gerenciador de arquivos padrão.
Ruslan
3

Como @richard diz, é semelhante ao Windows. Um gerenciador de arquivos genérico pode examinar primeiro o nome de um arquivo e tentar reconhecer uma extensão de arquivo associada a um programa. Se isso falhar, ele pode tentar abrir o arquivo e procurar um cabeçalho. Se você tentar ler um arquivo que não seja de texto (por exemplo, um arquivo .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'

KidElephant
fonte
2
Alguns gerenciadores de arquivos analisam o conteúdo do arquivo antes da extensão do nome do arquivo (talvez até sempre ignorem a extensão, não tenho certeza). Por exemplo, no Dolphin do KDE, se você tiver imagens GIF associadas a um navegador e PNG ao visualizador de imagens, renomear o file.pngarquivo PNG para file.gifainda abrirá o visualizador de imagens. E se você esvaziar o arquivo, ele será aberto no editor de texto.
Ruslan
3

Tentarei dar uma resposta subjacente sobre como os sistemas Unix lidam com arquivos. Como outros já apontaram, sua formulação da pergunta é enganosa, pois os arquivos em si não informam 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 sequência de bytes. Dos sistemas operacionais de Tanenbaum , terceira edição:

Com efeito, o sistema operacional não sabe ou se importa com o que está no arquivo. Tudo o que vê são bytes. Qualquer significado deve ser imposto por programas no nível do usuário.

É 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 executar o sistema operacional. Isso inclui diretórios, links, tubos, soquetes e arquivos de dispositivos. ¹

É por convenção que os nomes de 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 da web, etc. De Tanenbaum:

Em alguns sistemas (por exemplo, UNIX), as extensões de arquivo são apenas convenções e não são impostas pelo sistema operacional. Um arquivo chamado file.txt pode ser algum tipo de arquivo de texto, mas esse nome é mais para lembrar o proprietário do que para transmitir qualquer informação real ao computador. Por outro lado, um compilador C pode realmente insistir que os arquivos a serem compilados terminem em .c e pode se recusar a compilá-los se não o fizerem.

Se um arquivo é salvo ou renomeado sem a extensão adequada, ele ainda mantém 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 dos arquivos será solicitada 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 no nível do usuário. Por exemplo, a variável EDITORé usada para especificar qual editor de texto abrir ao manipular texto vim, por exemplo nano, etc. É assim que os processos sabem qual editor abrir, como ao editar uma gitmensagem de confirmação. Caso contrário, você está correto ao especificar qual aplicativo usar. Observe que vimdetecta tipos de arquivo verificando extensões e inspecionando o conteúdo do arquivo, se a configuração filetype onestiver definida, que aplica o realce, a indentação etc. da sintaxe correta ²

TL; DR

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

Roberto Gomez
fonte