Por que o "she-bang" começa com um "#!"?

10

Por que o "she-bang" começa com um #!, como #!/bin/bash? Eu sempre aceitei que é assim que é feito, mas há uma razão por trás disso?

Por que começar com #; isso não é geralmente um comentário? Ou é o ponto que deve ser comentado?

Johan
fonte
4
A Wikipedia tem uma história bastante detalhada de #!(tanto quanto o dmr se lembra…), incluindo uma explicação de por que a #(sim, a linha teve que ser ignorada pelos shells existentes).
Gilles 'SO- stop be evil'
Falhou ao verificar a wikipedia :)
Johan
1
Eu só queria que as conchas eram bastante inteligente para tirar uma estranha CR / LF se ele está lá ...;)
Aaron D. Marasco

Respostas:

16

Normalmente, shebang refere-se apenas a #!( !é normalmente chamado de "bang" e parece que "ela" é uma corrupção de "SHArp" ou "haSH" para #) - a linha inteira é chamada de linha de shebang

Ele intencionalmente começa com um caractere de comentário para compatibilidade com versões anteriores com coisas que não sabem como lidar com isso; o !é, presumivelmente, apenas para distingui-lo de um comentário aleatório de iniciar o arquivo, para um arquivo que começa com # this is my script!não tentar executar o this is my script!intérprete

Michael Mrozek
fonte
2
Bang !é frequentemente usado em outros contextos para indicar um comando a ser executado. Por exemplo, em vimou outros programas com suas próprias linhas de comando, bang geralmente é o caractere de escape que os faz executar o comando em um shell do sistema em vez de em sua interface interna.
Caleb
4

Para entender isso, você deve perceber que a primeira linha do script é realmente lida duas vezes , por 2 programas diferentes. Na primeira vez, o kernel abre o arquivo e procura a sequência de caracteres ( #!) na primeira linha. Se encontrar, ele executa o programa shell indicado lá, passando o nome do arquivo como parâmetro. (por exemplo, se o arquivo /home/me/foocomeçar #!/bin/sh, o kernel será executado /bin/sh /home/me/foo).

Em seguida, o shell ( bin/shou qualquer programa de intérprete especificado) lê o arquivo. O shell não sabe nada sobre linhas shebang, mas ainda lerá a primeira linha porque é como qualquer outra linha no arquivo ... lê todas elas. Você não quer que o shell trave ou altere seu comportamento de forma alguma ... a maneira de fazer isso é tratá-lo como um comentário e ignorá-lo. Assim, o melhor caractere para uma instrução do kernel começar seria o caractere de comentário.

JoelFan
fonte
É realmente o kernel que faz isso, parece que ele é o shell atual em que trabalha, que irá analisar o shebang e empurre o script
Johan
Não ... é o próprio núcleo, vivo e pessoalmente. Funcionará mesmo se você não estiver usando um shell para executar o script ... existem outras maneiras de executar um arquivo além de um shell ... por exemplo, a partir de um programa C, usando a chamada de sistema "exec"
JoelFan
pt.wikipedia.org/wiki/Shebang_(Unix)#Magic_number "#!" em ascii são os bytes 0x23 0x21 - quando exec () vê esses bytes, o comportamento é tratar o restante da linha como um caminho para um intérprete.
Aaron McMillin 27/03
1

Ele precisa ser um comentário, porque somente dessa maneira também funcionará para executar um script como "interpretername scriptname". Eu não sei sobre a origem do "!".

Sven Geggus
fonte
1
Mesmo se você acabou de executar ./scriptname, o intérprete ainda vê a linha she-bang, portanto ainda precisa ser um comentário.
psusi 13/07/11
1
Ou para ser mais detalhado: o shebang: '#!' foi projetado para não ser visto pelo intérprete - portanto, ele deve começar com o comentário char '#'. Em vez disso, é 'visto' (e interpretado) pelo conjunto de chamadas do sistema 'exec [lv] *' do kernel.
Arielf 13/05