Peczenyj's Blog

Just Another /Perl|Ruby|C++|Java|Python|JavaScript|Flash|Bash/ Hacker

Resolvendo Problemas Comuns 2 - Bad Interpreter

Seguindo na nossa sessão de dicas, quem nunca passou por isso?

$ ./script.sh
: bad interpreter: No such file or directory

$ cat script.sh
#!/bin/bash
echo "oi"

- Hein? Mas está tudo certo, eu tenho um /bin/bash, o que está acontecendo?

Bom, vamos ver mais de perto:
$ cat -v script.sh  # 'show nonprinting'
#!/bin/bash^M
echo "oi"^M


Ahá! Tem um ^M no final das linhas atrapalhando.
- Mas o que é isso?
Muito provavelmente a origem desde script é uma maquina windows. A explicação é o caracter newline. O windows precisa de 2 caracteres para simbolizar o fim de uma linha em um arquivo texto puro, a dupla \r\n (veja link para a wikipedia), porém os *nix não precisam do \r – que o cat gentilmente mostrou como um ^M. Este caracter a mais atrapalha o interpretador, que não recebe um /bin/bash e sim /bin/bash\r – e isso realmente não existe.

Como resolver? Existem dois programas para este fim: unix2dos e dos2unix (as vezes aparecem como unixtodos e dostounix) que convertem os finais de linha em casos como este. Se vc abrir um arquivo texto do *nix em um bloco de texto vai ver todas as quebras de linha substituidas por um quadrado preto e todas as linhas em uma só.

Caso vc não tenha um programa conversor, pode usar o SED
$ sed -i 's/\r$//' script.sh
$ ./script.sh
oi


O tr também poderia ser usado, mas não é tão amigável.
$ tr -d '\r' < script.sh > novo_script.sh


Este detalhe pode ser muito importante um dia!

Comments

arpapa
Pode também converter usando o comando dos2unix script.sh que funciona legal.
Rioges
Resolveu o meu problema, muito obrigado pela dica!!