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

75

Eu queria executar um script de shell:

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

Eu 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 usuário root sob o grupo root .

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

    
por user165062 06.06.2013 / 22:17

7 respostas

132

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 tal arquivo: é chamado /bin/bash .

O ^M é um caractere de retorno de carro . O Linux usa o caractere feed de linha para marcar o final de uma linha, enquanto o Windows usa a sequência de dois caracteres CR LF. Seu arquivo tem finais de linha do Windows, o que confunde o Linux.

Remova os caracteres espúrios de CR. Você pode fazer isso com o seguinte comando:

sed -i -e 's/\r$//' create_mgw_3shelf_6xIPNI1P.sh
    
por Gilles 06.06.2013 / 22:25
16

No vim você também pode usar :set ff=unix e salvar o arquivo, ou :set ff=dos para obter novamente a formatação do DOS.

    
por ortang 07.06.2013 / 10:33
11

Seu arquivo tem terminações de linha estilo DOS / Windows (CR LF) , mas em sistemas Unix-like somente o caractere de controle LF é usado como quebra de linha.

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

Para converter os finais de linha do estilo DOS / Windows para o estilo Unix, existe uma ferramenta chamada dos2unix . Você instala usando:

sudo apt-get install dos2unix

Então você pode simplesmente converter as terminações de linha dos arquivos de ambas as formas 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 poderá interpretar o arquivo corretamente.

    
por Byte Commander 15.12.2016 / 21:31
4

Como explicado nas outras respostas, essa é uma questão de formato. Então, a resposta é mudar o formato dos finais de linha do estilo DOS para o Unix. Esta é mais uma maneira simples de corrigir o seu arquivo 'no lugar'

fromdos file

Está disponível no pacote tofrodos :

sudo apt-get install tofrodos
    
por josediazaz 08.06.2013 / 00:50
3

Faça vi <your script> .

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

substitua o caractere:

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

    
por Pankaj Sain 07.06.2013 / 09:41
2

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

    
por tphistry 03.12.2013 / 03:40
2

O problema é que você edita com o Dos!

abra seu arquivo com o vi depois defina o unix com:

:set ff=unix
:wq

e tudo bem

    
por DaFreder 28.04.2016 / 18:29