Que o Shell Unix/Linux é muito poderoso todo mundo sabe (ou deveria saber), e que o Shell Script tem que ter (será?) em sua primeira linha o famoso “#!” SheBang você também sabe né ?

Em miúdos, o shebang “#!” nada mais é que aqueles dois primeiros caracteres da primeira linha de um script, que passa a informação de qual Shell será usado para a execução de todos os passos contidos em seu script. Pode ser bash, csh, ksh ou outro…

Mas o que pouca gente sabe, é que se você quiser, ele nem precisa estar ali dentro do seu script!

Como é a historia? Duvido!!

Pois é, pode duvidar, e pra botar mais lenha na fogueira ainda, eu digo que rodo o script sem o shebang e sem dar permissão de execução! Vai me chamar de doido agora né? :P

Então vamos aos fatos e ver como isso funciona! :)

Para fins didáticos criei o script chamado teste.sh com o seguinte conteúdo dentro:

#!/bin/bash

echo “Eita! isso funciona mesmo!!”

Vamos ver as permissões dele…

rizada@m0rph3us:~$ ls -la teste.sh
-rw-r–r– 1 rizada rizada 48 Jan 20 00:10 teste.sh

Ainda sem permissão de execução, mas vamos adicionar agora!

rizada@m0rph3us:~$ chmod +x teste.sh

Veremos a permissão agora.

-rwxr-xr-x 1 rizada rizada 48 Jan 20 00:10 teste.sh

Pronto! permissão de execução aplicada, iremos agora executar o bendito e ver seu resultado.

rizada@m0rph3us:~$ ./teste.sh
Eita! isso funciona mesmo!!

É claro que funciona! :)

Agora vamos tirar a permissão de execução, e modificar o script para ele rodar sem o shebang!

rizada@m0rph3us:~$ chmod -x teste.sh

Pronto! Sem permissão de execução, agora o próximo passo é abrir o arquivo e arrancar de lá de dentro o #!/bin/bash e substituir por apenas “:” (dois pontos). Isso mesmo! Somente dois pontinhos! ;) vai ficar assim:

:

echo “Eita! isso funciona mesmo!!”

Pronto! O segredo está todinho aí. Basta você chamar o Shell que deseja usar e passar como parâmetro o script propriamente dito veja:

Rodando com o BASH:

rizada@m0rph3us:~$ /bin/bash teste.sh
Eita! isso funciona mesmo!!

Rodando com o SH:

rizada@m0rph3us:~$ /bin/sh teste.sh
Eita! isso funciona mesmo!!

E por aí vai…

A explicação é simples, vou copiar e colar aqui exatamente o que o Guru do Shell Script Julio Neves, postou na lista ShellScriptBR:

…..diversas linguagens tem um cmd “não faça nada”. Exs:
NOP – No OPerate – Assembler;
NEXT SENTENCE – COBOL

Estes cmds são usados para cumprir formalidades de sintaxe. Ex:
if cd dir 2> /dev/null
then
:
else
mkdir dir
cd dir
fi

Isto é na primeira linha vc testa se existe o diretório e se existir, vc já
terá feito o cd para dentro dele, desta forma o then perdeu o sentido. Mas
como a sintaxe do if obriga a existência do then, então o colocamos com o
cmd : que não faz nada e sempre volta verdadeiro (true)…..

Pensei em escrever esse post justamente porque eu pensava que quase todo mundo sabia que isso funcionava assim, o que pra minha surpresa pouca gente sabe. A um tempo atrás eu vi em uma grande empresa que um amigo trabalha, varios scripts  feitos dessa forma com os “:” no lugar do famoso shebang. Segundo ele, ficou como de costume os programadores de lá fazerem scripts assim por conta do parque misto entre Linux com alguns Red Hat e Suse Enterprise e outros servidores Solaris de versões diferentes. Segundo ele, isso é bom porque na hora de agendar o script no Cron usa o Shell padrão que tem na maquina, seja ele bash, sh, etc… Até tem uma certa lógica, mas essa desculpa não me convenceu nem um pouco! :P

Sinceramente, não posso dizer que isso é uma gambiarra, mas em minha opinião eu acho muito deselegante com o pobre do Script! :P Pois o que custa, abrir o script com o vi, pico, nano e editar apenas a primeira linha ?

A mensagem na lista ShellScriptBR pode ser lida na integra aqui:

http://br.groups.yahoo.com/group/shell-script/message/30843

Bem, é isso! Pra quem não sabia, agora já sabe que pode sim, rodar scripts em shell sem o shebang e sem permissão pra executar. hehehe. :)

Até a proxima.