Não é possível executar um arquivo .sh: / bin / bash ^ M: intérprete incorreto
Eu queria executar um script de shell:
Tentei fazer um procedimento padrão, mas recebi este erro:
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
Este não é um problema de permissão, você não está recebendo uma mensagem sobre permissões
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:
Ou instale e use o dos2unixprograma.
— Argentpepper 6/06/2013
obrigado por isso, todas as outras respostas que encontrei até agora não ajudaram. Este fez isso!
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 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.
Abri-lo no gedit e, fazer Salvar como e selecione "de fim de linha: Unix / Linux"
— Mattmon
No vim, você também pode usar :set ff=unixe salvar o arquivo ou :set ff=dosobter a formatação do DOS novamente.
— ortang
este fez isso por mim, thx
— bunkerdive 6/08/15
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:
Em seguida, você pode simplesmente converter as terminações de linha dos arquivos de ambos os modos usando
No seu caso, basta executar este comando abaixo e o arquivo de script será convertido no local:
Depois disso, o Bash deve ser capaz de interpretar o arquivo corretamente.
Obrigado, o dos2unix também está disponível para o macOS via brew.
— Muhammad Annaqeeb 18/09/19
O problema é que você edita com o Dos!
abra seu arquivo com vi e defina unix com:
— DaFreder
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
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
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'
Está disponível no pacote tofrodos:
— josediazaz
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.