Resolvendo "bad interpreter" no Bash

Ao executar um script que você pegou ou baixou da internet, muitas vezes foi um script criado num Windows , ou baixou do PasteBin, e ao executá-lo, você recebe a seguinte mensagem:

./script.sh
bad interpreter: No such file or directory
cat script.sh
#!/bin/bash
echo "oi"

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.

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 , 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

Fonte: http://peczenyj.blogspot.com.br/2007/07/resolvendo-problemas-comuns-2-bad.html