Extensões de arquivos e associação com programas no linux

2

No Windows, podemos associar a extensão de um arquivo a programas.
Por exemplo. um arquivo test.pl pode ser executado pelo intérprete Perl instalado devido à extensão pl .
No linux, ele precisa de #!/usr/bin/perl como a primeira linha.
Isso acontece porque não há associação entre extensões de arquivos e programas no Linux?

    
por Cratylus 05.04.2013 / 21:49

6 respostas

7

Não, isso não significa isso. Se você tiver um arquivo de texto com o seu conjunto de permissões de execução (por exemplo, chmod a+x somefile ), e a primeira linha do arquivo for algo como

"#!/path/to/executable"

Ele apenas diz ao Unix que programa usar para executar o script. Se um arquivo de texto estiver marcado como um executável (ou seja, um script), o Unix iniciará qualquer programa especificado dessa maneira e enviará o restante do arquivo de texto (o script) para esse programa. Tipicamente o programa especificado será um shell ( /bin/sh , /bin/csh ou /bin/bash ), o interpretador para alguma linguagem de programação (Perl, Python ou Ruby) ou algum outro programa que execute scripts (como os manipuladores de texto Awk ou Sed).

Normalmente, o "#" especifica um comentário em vários idiomas, somente se a linha primeiro começar com "#!" é algo especial. Se um arquivo estiver marcado como executável, mas não começar com "#!", O Unix assumirá que é algum tipo de binário (por exemplo, um executável ELF feito pelo compilador C e pelo vinculador).

Em geral, o Unix não depende do sufixo dos arquivos. Muitos programas não precisam nem adicionam automaticamente seus sufixos típicos, sendo uma exceção os programas de compactação (como gzip e bzip2 ) que geralmente substitui o arquivo original por um compactado, adicionando um sufixo para marcar o tipo de compactação. um dos poucos programas que reclama de sufixo incorreto).

Em vez disso, o arquivo é identificado pelo seu conteúdo através de uma série de testes, procurando por "números mágicos" e outros identificadores (você pode tentar o comando 'arquivo' em alguns arquivos para testar isso). Isso também é usado pelos navegadores de arquivos no GNOME e no KDE para selecionar ícones e a lista de programas para abrir / editar o arquivo. Aqui, o tipo MIME do arquivo é identificado por tais testes, em seguida, os programas adequados para visualização e edição são encontrados em uma lista associada ao tipo MIME - não ao sufixo como no Windows.

Como um dos testes seria verificar se a primeira linha de um arquivo de texto é "#! / alguma coisa" e, em seguida, observe o que "algo" é; você poderia dizer, por exemplo, que #!/usr/bin/perl identificou o arquivo como um script perl - mas isso é mais um efeito colateral. Em qualquer caso, é o conteúdo do arquivo usado para identificá-lo, não um sufixo arbitrário. Como tal, terminações como .pl (Perl) e .awk (Awk) são puramente para ajudar um usuário humano a identificar o tipo de arquivo, ele não é usado pelo Unix para o tipo de impedimento (como os sufixos no Windows).

Você pode realmente criar um "script" sem o "#! / something", mas o Unix não poderá executá-lo automaticamente como um executável (não saberia em qual programa executar o script). Em vez disso, você teria que "iniciar" manualmente com algo como perl myscript ou python myscript . Muitos scripts em aplicativos Python e Perl maiores na verdade não serão iniciados com "#! / Alguma coisa", pois são scripts para "uso interno" e não se destinam a serem invocados diretamente pelo usuário.

Em vez disso, você iniciará o script principal (que começa com "#! / something") e passará esses outros scripts para o interpretador enquanto este script for executado.

    
por 06.04.2013 / 00:03
4

In windows we can associate a file's extension with programs. E.g. a file test.pl can be run by the installed Perl interpreter due to the pl extension.

Certo, mas a extensão é apenas uma sugestão sobre o tipo de arquivo que é. Um script sintaxe perl ainda é um script sintetizado por perl, independentemente de ser chamado ".pl" ou ".exe" ou ".doc". Você ainda pode executá-lo chamando o intérprete diretamente, por exemplo; perl.exe thisfile.doc funcionará se o arquivo for um arquivo sintaxe perl. Pode-se também associar '.blah' a ser um arquivo perl também se você quiser.

In linux though it needs #!/usr/bin/perl as the first line.

Novamente, isso é apenas uma dica. Você ainda pode chamar um arquivo perl sem o shebang invocando diretamente o script como um argumento para o comando perl .

Is this because there is no association between file extensions and programs in Linux

Tecnicamente, sim, existe.

O Linux na verdade possui várias maneiras de identificar o formato do executável. O comando file oferece uma ilustração disso. Ele contém um banco de dados de "mágica" (seqüências de certos comprimentos em certos deslocamentos) para determinar que tipo de arquivo é algo. Ele faz isso inspecionando o conteúdo do arquivo para descobrir o que é. Outra maneira de fazer isso é com a extensão do arquivo. Você pode realmente registrar o comportamento desejado usando um sistema chamado 'binfmt_misc'. Wikipedia explica como isso funciona (usando 'magia' e extensões de arquivo).

Um arquivo é arbitrariamente considerado 'executável' no linux pela noção do bit 'executável' nas permissões do arquivo. Quando você tenta executar um aplicativo que possui o bit executável, o kernel lerá os primeiros bytes do arquivo para determinar o que fazer.

  • Se o arquivo começar com #! , invoque o comando no caminho fornecido e torne o arquivo a seguir o último argumento desse comando.
  • Se o arquivo iniciar com ELF, execute /lib{64}/ld-linux.so (isso é realmente buscado no cabeçalho da seção do binário ELF, não é um caminho estático usado) seguido pelo comando (isso executa uma série de carregamento estático de bibliotecas ).
  • Veja quais regras se aplicam a binfmt_misc.

formatos a.out Eu não estou muito familiarizado com o seu invokation - eu assumo que o carregador ld-linux.so ainda os manipula.

    
por 05.04.2013 / 22:32
1

A linha shebang (#!) é usada para indicar qual versão Perl você está usando, e também para invocar o script diretamente do shell

./myscript.pl 

Você também pode fazer isso sem a linha shebang:

perl myscript.pl
    
por 05.04.2013 / 21:51
1

Você simplesmente não pode fazer tais comparações, não é que o GNU / Linux não tenha associação entre extensões de arquivos e programas, é porque o GNU / Linux realmente não se importa com isso.

Você tem permissões de arquivo e, se o seu arquivo for executável, ele procurará SEMPRE o shebang na primeira linha de qualquer script para ver como executá-lo.

Os binários ELF do Linux, por outro lado, não possuem extensões exe como os binários do Windows, e são sempre executáveis, mesmo sem qualquer extensão.

    
por 05.04.2013 / 21:59
1

Não, não é. Shebangs ( #! ) e associações entre tipos de arquivos e aplicativos servem a propósitos diferentes, e você pode encontrar tanto em distribuições Linux de desktop.

É costume usar o primeiro em scripts executáveis que você chama a partir da linha de comando ou de outros scripts, e não depende de extensões de arquivo. Funcionalidade semelhante é obtida no Windows por meio da variável de ambiente PATHEXT, que depende das extensões de arquivo.

O último serve usuários que clicam em ícones ou nomes de arquivos em uma interface de desktop. No mundo Linux, isso vem de associação de tipos MIME a aplicativos , que, obviamente, é gerenciada por ferramentas específicas e não requer a leitura da especificação de usuários típicos de desktop.

    
por 18.05.2014 / 21:55
0

Sim. Não há suporte para extensões no Linux. Você está correto sobre a primeira linha, por exemplo, shebang line. Ela é usada para descobrir qual programa usar para executar o arquivo, como nas janelas que você tem extensões de arquivo.

Mesmo que você tenha visto algo parecido com .sh .pl no final no linux, eles estão prontos para entender o tipo de arquivo simplesmente procurando.

No Windows, as extensões significam tudo e, com base nelas, o aplicativo correto será usado para executá-lo. Por ex: .xls significa arquivo do Excel, .doc significa Word Doc, .exe é considerado executável, para o mesmo no linux, mas você precisa conceder permissões de execução para o arquivo e só você pode executar como ./filename .

No Windows, a correspondência de extensões e programa a ser usado para executar aplicativos geralmente é armazenada no registro. Portanto, se não houver correspondência armazenada para .pl , essa extensão não faz sentido semelhante ao linux e você terá que selecionar binário para executá-lo explicitamente.

    
por 06.04.2013 / 13:00