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
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.
É 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 "!".
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.
#!
(tanto quanto o dmr se lembra…), incluindo uma explicação de por que a#
(sim, a linha teve que ser ignorada pelos shells existentes).Respostas:
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 shebangEle 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 othis is my script!
intérpretefonte
!
é frequentemente usado em outros contextos para indicar um comando a ser executado. Por exemplo, emvim
ou 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.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/foo
começar#!/bin/sh
, o kernel será executado/bin/sh /home/me/foo
).Em seguida, o shell (
bin/sh
ou 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.fonte
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 "!".
fonte