Uso de '#!' em scripts * nix

4

Em muitos scripts da Apple / Unix eu vejo coisas precedidas por '#' que, até onde eu sei, significa que é uma observação. No entanto, muitas vezes você vê chamadas de shell como abaixo (a linha com #! ).

## Setting a default route 
#!/bin/sh

/sbin/route add SUBNET $5

Eu estou querendo saber se isso é apenas um comentário ou se realmente faz alguma coisa. Obrigado pelo conselho de seus especialistas: -)

    
por Edgar Wieringa 23.02.2011 / 12:18

2 respostas

16

É uma maneira de definir qual shell deve ser invocado durante a execução do script. É chamado de Shebang .

Exemplo, um arquivo com a seguinte linha Shebang:

#!/bin/sh

invocaria o shell Bourne (sh). Então, por exemplo, seu roteiro:

## Setting a default route 
#!/bin/sh

/sbin/route add SUBNET $5

faria com que /sbin/route add SUBNET $5 fosse executado no interpretador do shell Bourne. /sbin/route add SUBNET $5 é apenas um comentário e não faz nada. No entanto, o shebang deve estar na primeira linha, portanto, esse comentário no topo não permitirá que o shebang faça seu trabalho, tornando-o uma adição inútil.

Há um número de intérpretes que são amplamente utilizados e alguns intérpretes típicos para as linhas shebang são:

  • #!/bin/sh - Execute usando sh, o shell Bourne (ou um shell compatível)
  • #!/bin/csh - Executa usando csh, o shell C (ou um shell compatível)
  • #!/usr/bin/perl - Executar usando Perl
  • #!/usr/bin/python - Execute usando Python
  • #!/usr/bin/php - Executar usando o interpretador de linha de comando do PHP

Como Olli mencionou em seus comentários, algumas vezes env (abreviação de ambiente) é usado para garantir que caminho para o intérprete é escolhido.

    
por 23.02.2011 / 12:20
4

Um pouco mais de explicação técnica:

Quando você executa um executável em UNIX / Linux / Windows / SomeOS / AnyOS, o sistema precisa saber como executá-lo. No UNIX / Linux, existem regras especiais para os primeiros bytes dos arquivos para informar ao kernel como executá-lo. Para scripts, os caracteres especiais são '#!'. Se o kernel vir isso como os dois primeiros caracteres, ele saberá que o arquivo é um script e examinará o restante da linha do executável que executa o script. Então, se o arquivo /path/to/script.sh começar:

#!/bin/sh

O kernel veria '#!', saiba que é um script, encontre e execute / bin / sh e passe o caminho do arquivo de script /path/to/script.sh como um parâmetro. Como todos os interpretadores de script (bash, perl, csh, python, etc) usam '#' como caractere de comentário, todos eles simplesmente ignoram ' shebang 'linha como comentário.

Você provavelmente nunca viu isso antes porque o Windows lida com isso de maneira completamente diferente. No Windows, ele não usa esses caracteres 'mágicos', mas mapeia a extensão do arquivo para a maneira de executá-la.

    
por 24.02.2011 / 00:35