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?
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?
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 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
!
é frequentemente usado em outros contextos para indicar um comando a ser executado. Por exemplo, em vim
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.
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 "!".
#!
(tanto quanto o dmr se lembra…), incluindo uma explicação de por que a#
(sim, a linha teve que ser ignorada pelos shells existentes).