O que o #! faz

Essa eu li em http://br.geocities.com/cesarakg/tips-shell-programming.html.

Quando 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.

tags:

comments powered by Disqus