Shell Script sem SheBang?! Pode?
Jan 20
Linux, Tutoriais bash, csh, hashbang, hashpling, Julio Neves, Linux, script, sh, shebang, shell script, unix 2 Comments
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é?
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!
Sinceramente, não posso dizer que isso é uma gambiarra, mas em minha opinião eu acho muito deselegante com o pobre do Script!
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.




Apr 22, 2010 @ 20:55:00
Grande rizada, abraços man !
Apr 23, 2010 @ 23:09:34
Fala Julio! volte sempre meu brother!