O que o #! faz
Escrito por meleu em 16 Jul 2007Quando executamos um arquivo que começa com o #! (chamado de hash-bang) o kernel lê o arquivo, vê o hash-bang, e continua a ler o resto da linha. Então ele pega o que ele encontrar nesta linha depois do hash-bang e executa tendo como parâmetro o próprio arquivo.
Vamos aos exemplos:
O arquivo abaixo chama-se hello.sh:
#!/bin/bash
# hello.sh: o famigerado "Hello World!"
echo "Hello World!"
quando é digitado no shell:
prompt$ ./hello.sh
o kernel vai ver o #! e vai ler o que vem a seguir, neste caso '/bin/bash'. E então ele executa o equivalente a isto:
prompt$ /bin/bash hello.sh
Então lembrando: o kernel lê o que está depois do hash-bang e executa o que estiver lá, usando o nome do arquivo como parâmetro. No caso do exemplo acima temos o seguinte:
O que foi lido após o hash-bang: /bin/bash
Nome do arquivo: hello.sh
Um exemplo muito interessante mencionado no texto é o seguinte:
O nome do arquivo é helpme.
#!/bin/cat
vi unix editor
man manual pages
sh Bourne Shell
ksh Korn Shell
csh C Shell
bash Bourne Again Shell
O que é lido após o hash-bang: /bin/cat
Nome do arquivo: helpme
Portanto será executado: /bin/cat helpme
Uma observação interessante é que o bash (e a maioria dos shells) considera tudo que vem depois de um caractere '#' como comentário, portanto o hash-bang e toda a sua linha é um comentário para o shell. Porém no exemplo helpme acima, o /bin/cat não vai ignorar e #! e irá exibir o contúdo de todo o arquivo.
No documento mencionado existem outras dicas. O texto é curto e de rápida leitura. Eu recomendo.