Não é possível executar um arquivo .sh: / bin / bash ^ M: intérprete incorreto

107

Eu queria executar um script de shell:

-rwxr-x--x 1 root root   17234 Jun  6 18:31 create_mgw_3shelf_6xIPNI1P.sh

Tentei fazer um procedimento padrão, mas recebi este erro:

./create_mgw_3shelf_6xIPNI1P.sh 
localhost 389 -l /opt/fews/sessions/AMGWM19/log/2013-06-06-143637_CLA-0 
DEBUG   cd/etc/opt/ldapfiles/ldif_in ;
./create_mgw_3shelf_6xIPNI1P.sh 
localhost 389 -l /opt/fews/sessions/AMGWM19/log/2013-06-06-143637_CLA-0
**ERROR  sh: ./create_mgw_3shelf_6xIPNI1P.sh: /bin/bash^M: bad interpreter: No such file or directory**

O que isso significa? Eu estava fazendo isso como o rootusuário do rootgrupo.

Isso significa que o arquivo não tem a permissão correta para o rootusuário?

user165062
fonte

Respostas:

182

Este não é um problema de permissão, você não está recebendo uma mensagem sobre permissões

/bin/bash^M: bad interpreter: No such file or directory

O script indica que ele deve ser executado por um shell localizado em /bin/bash^M. Não existe esse arquivo: é chamado /bin/bash.

O ^Mé um caractere de retorno de carro . O Linux usa o caractere de avanço de linha para marcar o final de uma linha, enquanto o Windows usa o CR LF de seqüência de dois caracteres. Seu arquivo tem finais de linha do Windows, o que é confuso no Linux.

Remova os caracteres CR falsos. Você pode fazer isso com o seguinte comando:

sed -i -e 's/\r$//' create_mgw_3shelf_6xIPNI1P.sh
Gilles
fonte
22
Ou instale e use o dos2unixprograma.
Argentpepper 6/06/2013
4
obrigado por isso, todas as outras respostas que encontrei até agora não ajudaram. Este fez isso!
Qodeninja
não precisa ser Windows, recebi uma mensagem semelhante depois de copiar um script do OS X para o Ubuntu ... o dos2unix funcionou muito bem nesse caso, enquanto a substituição de '\ r' por nada seria pior, pois não há '\ n 'caracteres no arquivo.
Michael
1
@ Michael macOS usa \nporque é Unix. O script talvez fosse de uma versão anterior do Mac OS? Você poderia correr sed -i -e 's/\r$/\n/' script.shnesse caso.
precisa saber é o seguinte
1
Abri-lo no gedit e, fazer Salvar como e selecione "de fim de linha: Unix / Linux"
Mattmon
23

No vim, você também pode usar :set ff=unixe salvar o arquivo ou :set ff=dosobter a formatação do DOS novamente.

ortang
fonte
este fez isso por mim, thx
bunkerdive 6/08/15
19

Seu arquivo possui terminações de linha no estilo DOS / Windows (CR LF) , mas em sistemas semelhantes ao Unix, apenas o caractere de controle LF é usado como quebra de linha.

O caractere de controle CR adicional é mostrado codificado como ^Mem sua saída. Você também pode vê-lo quando executa cat -A create_mgw_3shelf_6xIPNI1P.sh.

Para converter as terminações de linha do estilo DOS / Windows para o estilo Unix, existe uma ferramenta chamada dos2unix. Você o instala usando:

sudo apt-get install dos2unix

Em seguida, você pode simplesmente converter as terminações de linha dos arquivos de ambos os modos usando

dos2unix FILENAME
unix2dos FILENAME

No seu caso, basta executar este comando abaixo e o arquivo de script será convertido no local:

dos2unix create_mgw_3shelf_6xIPNI1P.sh

Depois disso, o Bash deve ser capaz de interpretar o arquivo corretamente.

Byte Commander
fonte
1
Obrigado, o dos2unix também está disponível para o macOS via brew.
Muhammad Annaqeeb 18/09/19
5

O problema é que você edita com o Dos!

abra seu arquivo com vi e defina unix com:

:set ff=unix
:wq

e tudo bem

DaFreder
fonte
4

Faça vi <your script>.

então :set list; ele exibirá qualquer um dos caracteres especiais em seu script.

substitua o caractere:

:%s/^M//gc [para digitar, ^Mpressione Ctrl+ v+ m]

Pankaj Sain
fonte
Veja acima resposta sobre usando: fileformat que é IMHO melhor para lidar com isso do que a substituição mundial Além disso, veja stackoverflow.com/questions/14609779/... para idéias sobre como lidar com automaticamente
qneill
4

Conforme explicado nas outras respostas, esse é um problema de formato. Portanto, a resposta é alterar o formato do DOS para o final da linha de estilo Unix. Esta é mais uma maneira simples de corrigir seu arquivo 'no lugar'

fromdos file

Está disponível no pacote tofrodos:

sudo apt-get install tofrodos
josediazaz
fonte
2

Você também pode usar o gedit para remover os caracteres indesejados. No menu Arquivo, selecione Salvar como e defina o tipo de final de linha unix / Linux.

tphistry
fonte
+1 por isso, porque me ajudou com as terminações de linha do MacOS.
Bobble