Correção: Erro “Intérprete ruim: nenhum arquivo ou diretório” no Linux

Publicados: 2023-05-01
Pessoa digitando no miniteclado Cherry KW 9200
Hannah Stryker / How-To Geek
Se você receber um erro "intérprete ruim: arquivo ou diretório inexistente" ao executar um script de shell, será necessário converter o arquivo de script do Windows para as terminações de linha do Unix. Um método é usar o comando dos2unix , assim:

dos2unix script1.sh

Você tentou executar um script Bash e recebeu uma mensagem de erro “/bin/bash^M: bad interpreter: No such file or directory”? A saída não é muito útil e quase dá a impressão de que seu script está faltando. Felizmente, esse não é o caso e a correção é muito simples.

Índice

O que é o erro "Intérprete incorreto: nenhum arquivo ou diretório"?
Como corrigir um erro "Intérprete ruim: nenhum arquivo ou diretório"
Usando o comando dos2unix
Usando o comando tr
Usando o comando sed
Usando vi ou vim
Usando o Geany
Usando Kate ou Kwrite
Usando o Bloco de Notas++
Usando Código VS

O que é o erro “Intérprete incorreto: nenhum arquivo ou diretório”?

Receber uma mensagem de erro que diz /bin/bash^M: bad interpreter: No such file or directory significa apenas que seu arquivo shell script tem os finais de linha errados - os caracteres colocados no final de uma linha indicando que é hora de mover para o próxima linha. O Windows descendente do DOS gosta de ver um terminador de “retorno de carro e alimentação de linha” (CRLF), notado \r\n . Em contraste, Linux, macOS moderno e outros sistemas baseados em Unix usam apenas “line feed” (LF) ou \n .

Se você está vendo esse erro de mau intérprete, é provável que você ou a pessoa de quem você obteve o script o escreveu originalmente em um computador com Windows. O Bash vê esses finais de linha \r\n definidos pelo computador Windows e fica chateado porque eles impedem que o shell interprete corretamente seu script.

Uma mensagem de erro "intérprete ruim: arquivo ou diretório inexistente" em uma linha de comando do Linux.

Você pode até confirmar o problema em um terminal Linux apontando o comando file para o seu script.

 arquivo script1.sh 

Verifique as terminações de linha de um arquivo com o comando file no Linux.

Se o arquivo usar terminações de linha DOS, você verá a mensagem “com terminadores de linha CRLF” anexada à saída. Se nosso script estivesse usando as novas linhas do Unix (LF), ele não mencionaria os terminadores. Felizmente, voltar aos negócios da LF é fácil.

Como corrigir um erro “Intérprete ruim: nenhum arquivo ou diretório”

Tudo o que é preciso para se livrar dessa mensagem de erro e começar a executar seus scripts normalmente é alternar dos finais de linha do DOS para os finais de linha do Unix. Você pode fazer isso com comandos de terminal ou em seu editor de código favorito. Aqui estão oito maneiras de corrigi-lo:

Usando o comando dos2unix

Existe um programa de linha de comando feito apenas para converter arquivos DOS (também conhecidos como Windows) em arquivos totalmente compatíveis com Unix apropriadamente chamados dos2unix . Está disponível na maioria dos repositórios padrão, então você pode instalá-lo no Ubuntu com:

 sudo apt instalar dos2unix

Em nossa instalação do Fedora, dos2unix veio pré-instalado, mas você pode confirmar se o possui com:

 sudo dnf instalar dos2unix

No ArchLinux:

 sudo pacman -S dos2unix

Usar dos2unix é simples; apenas dê a ele o nome do arquivo.

 dos2unix script1.sh 

Insira o comando dos2unix.

Verifique com file se quiser confirmar se a conversão foi bem-sucedida antes de executar o script. Você também pode converter em massa nomeando vários arquivos separados por apenas um espaço.

 dos2unix script1.sh script2.sh script3.sh

Ou, se você tiver uma nomenclatura de arquivo consistente, é claro que poderá escrever comandos mais curtos usando curingas.

 script dos2unix*.sh 

Use um asterisco em seu comando dos2unix para converter com um curinga.

O comando dos2unix possui vários sinalizadores para ajudá-lo a fazer tipos especiais de conversões, como alterar a propriedade do arquivo. Você pode até usá-lo na forma reversa, unix2dos , se quiser voltar ao CRLF. Digite dos2unix --help para saber mais.

Usando o comando tr

Se você não pode ou não deseja instalar um utilitário dedicado, o Linux possui ferramentas integradas que limparão essas novas linhas. Com o comando tr , você pode remover a parte \r das terminações de linha para que fiquemos com os terminadores \n .

 tr -d '\r' < script1.sh > script1_unix.sh

Aqui, tr está pegando o texto do arquivo script1.sh , excluindo todas as instâncias de \r que encontrar e salvando a saída como o arquivo script1_unix.sh .

Usando o comando sed

O poderoso comando sed embutido em seu shell também pode alterar as terminações de linha do seu arquivo.

 sed -i 's/\r//' script1.sh

Se você não estiver familiarizado com a sintaxe sed , estamos dizendo sed para editar nosso arquivo ( -i ) e substituir ( s/ ) cada retorno de carro ( \r ) por nada. Isso nos deixa com os terminadores de linha \n preferidos do Unix.

Usando vi ou vim

Se você usa vi ou vim para editar seus scripts, basta passar este comando para converter o arquivo atualmente aberto em terminações de linha Unix.

 :set fileformat=unix 

Altere o formato do arquivo de script com um comando vim.

RELACIONADO: Como sair do editor Vi ou Vim

Usando o Geany

Se você estiver trabalhando em um ambiente de desktop, não há razão para brincar no terminal apenas para preparar seus arquivos para o mundo Unix. Praticamente todos os editores de código e IDE existentes possuem uma alternância para finais de linha. Isso inclui Geany.

Para converter terminações de linha em Geany, vá para Documento > Definir terminações de linha > Converter e definir para LF (Unix).

No Geany, no menu Documento, vá para "Definir finais de linha" e escolha "Converter e definir para LF (Unix)".

Salve seu script e tente executá-lo novamente.

Usando Kate ou Kwrite

Se você usar o Kwrite para editar seu script, ou o primo mais poderoso do Kwrite, Kate, poderá converter para o formato LF clicando em Ferramentas > Fim da linha > Unix.

No Kwrite, no menu Ferramentas, abra "Fim da linha" e selecione "Unix".

Salve o arquivo e execute seu script novamente.

Usando o Bloco de Notas++

Se você editar o código no Notepad ++, também poderá converter facilmente as terminações de linha, o que é útil porque provavelmente o está executando no Windows (a menos que tenha instalado o Notepad ++ para Linux) e pode convertê-los antes de passar para o sistema Linux. Com o arquivo aberto, vá em Edit > EOL Conversion > Unix (LF).

Certifique-se de salvar seu script antes de executá-lo.

Se você deseja que o Notepad ++ crie arquivos com terminações de linha Unix por padrão, vá para Configurações> Preferências, selecione a guia "Novo documento" e, nas opções "Formato (final de linha)", clique no botão de opção "Unix (LF)".

Usando Código VS

O Visual Studio Code (VS Code) funciona da mesma maneira, apenas a alternância é ainda mais fácil de encontrar. Basta clicar em “CRLF” no canto inferior direito da janela do VS Code.

Você também pode definir o VS Code para usar terminações de linha Unix por padrão acessando Arquivo > Preferências > Configurações e digitando eol na barra de pesquisa de configurações. O resultado principal deve ser um menu suspenso para definir o “Eol”. Altere para “\n”.

Nas configurações do VS Code, altere a configuração EOL padrão para "\n".

RELACIONADO: Como tornar seus scripts Bash cientes do hardware