Correzione: errore "Cattivo interprete: nessun file o directory di questo tipo" in Linux

Pubblicato: 2023-05-01
Persona che digita sulla mini tastiera Cherry KW 9200
Hannah Stryker / How-To Geek
Se ricevi un errore "cattivo interprete: nessun file o directory di questo tipo" durante l'esecuzione di uno script di shell, devi convertire il tuo file di script da Windows a terminazioni di riga Unix. Un metodo consiste nell'utilizzare il comando dos2unix , in questo modo:

dos2unixscript1.sh

Hai provato a eseguire uno script Bash e hai ricevuto un messaggio di errore "/bin/bash^M: cattivo interprete: nessun file o directory di questo tipo"? L'output non è molto utile e dà quasi l'impressione che manchi il tuo script. Fortunatamente, non è così e la soluzione è molto semplice.

Sommario

Che cos'è l'errore "Cattivo interprete: nessun file o directory di questo tipo"?
Come correggere un errore "Cattivo interprete: nessun file o directory di questo tipo".
Utilizzando il comando dos2unix
Usando il comando tr
Usando il comando sed
Usando vi o vim
Utilizzando Geany
Usando Kate o Kwrite
Utilizzo di Blocco note++
Utilizzo del codice VS

Che cos'è l'errore "Cattivo interprete: nessun file o directory di questo tipo"?

Ottenere un messaggio di errore che legge /bin/bash^M: bad interpreter: No such file or directory significa semplicemente che il tuo file di script di shell ha le terminazioni di riga sbagliate: i caratteri posizionati alla fine di una riga che indicano che è ora di passare al riga successiva. A Windows discendente da DOS piace vedere un terminatore "ritorno a capo e avanzamento riga" (CRLF), annotato \r\n . Al contrario, Linux, macOS moderno e altri sistemi basati su Unix usano solo "line feed" (LF) o \n .

Se visualizzi questo errore di cattivo interprete, è probabile che tu o la persona da cui hai ricevuto lo script lo abbia scritto originariamente su un computer Windows. Bash vede quelle \r\n terminazioni di riga impostate dal computer Windows e si arrabbia perché impediscono alla shell di interpretare correttamente il tuo script.

Un messaggio di errore "cattivo interprete: nessun file o directory di questo tipo" in una riga di comando di Linux.

Puoi persino confermare il problema in un terminale Linux puntando il comando file al tuo script.

 file script1.sh 

Controlla le terminazioni di riga di un file con il comando file in Linux.

Se il file utilizza terminazioni di riga DOS, verrà visualizzato il messaggio "con terminatori di riga CRLF" aggiunto nell'output. Se il nostro script avesse utilizzato le nuove righe Unix (LF) appropriate, non menzionerebbe affatto i terminatori. Fortunatamente, tornare nel business LF è facile.

Come correggere un errore "Cattivo interprete: nessun file o directory di questo tipo".

Tutto ciò che serve per sbarazzarsi di quel messaggio di errore e iniziare a eseguire i tuoi script normalmente è passare dalle terminazioni di riga DOS alle terminazioni di riga Unix. Puoi farlo con i comandi del terminale o nel tuo editor di codice preferito. Ecco otto modi per risolverlo:

Utilizzando il comando dos2unix

C'è un programma a riga di comando fatto apposta per convertire i file DOS (alias Windows) in file completamente compatibili con Unix opportunamente chiamati dos2unix . È disponibile nella maggior parte dei repository predefiniti, quindi puoi installarlo su Ubuntu con:

 sudo apt installa dos2unix

Sulla nostra installazione di Fedora dos2unix è stato preinstallato, ma puoi confermare di averlo con:

 sudo dnf install dos2unix

Su ArcoLinux:

 sudo pacman -S dos2unix

Usare dos2unix è semplice; dagli solo il nome del tuo file.

 dos2unixscript1.sh 

Immettere il comando dos2unix.

Controllalo con file se vuoi confermare che la conversione è andata a buon fine prima di eseguire lo script. Puoi anche convertire in massa nominando più file separati solo da uno spazio.

 dos2unix script1.sh script2.sh script3.sh

Oppure, se hai nomi di file coerenti, puoi ovviamente scrivere comandi più brevi usando i caratteri jolly.

 script dos2unix*.sh 

Usa un asterisco nel tuo comando dos2unix per convertire con un carattere jolly.

Il comando dos2unix ha diversi flag per aiutarti a fare tipi speciali di conversioni, come cambiare la proprietà del file. Puoi anche usarlo in forma inversa, unix2dos , se vuoi tornare a CRLF. Inserisci dos2unix --help per saperne di più.

Usando il comando tr

Se non puoi o non vuoi installare un'utilità dedicata, Linux ha strumenti integrati che ripuliranno quelle nuove righe. Con il comando tr , puoi eliminare la \r parte delle terminazioni di riga in modo da rimanere con \n terminatori.

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

Qui, tr prende il testo del file script1.sh , elimina ogni istanza di \r che trova e salva l'output come file script1_unix.sh .

Usando il comando sed

Il potente comando sed integrato nella tua shell può anche cambiare le terminazioni di riga per il tuo file.

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

Se non hai familiarità con la sintassi sed , stiamo dicendo a sed di modificare il nostro file ( -i ) e sostituire ( s/ ) ogni ritorno a capo ( \r ) con niente. Questo ci lascia con i terminatori di riga \n preferiti di Unix.

Usando vi o vim

Se usi vi o vim per modificare i tuoi script, basta passare questo comando per convertire il file attualmente aperto in terminazioni di riga Unix.

 :set fileformat=unix 

Cambia il formato del file di script con un comando vim.

CORRELATO: Come uscire dall'editor Vi o Vim

Utilizzando Geany

Se lavori in un ambiente desktop, non c'è motivo di scherzare nel terminale solo per rendere i tuoi file pronti per il mondo Unix. Praticamente ogni editor di codice e IDE là fuori ha un interruttore per le terminazioni di riga. Ciò include Geany.

Per convertire le terminazioni di riga in Geany, vai su Documento> Imposta terminazioni di riga> Converti e imposta su LF (Unix).

In Geany, nel menu Documento, vai su "Imposta fine riga" e scegli "Converti e imposta su LF (Unix)".

Salva lo script e prova a eseguirlo di nuovo.

Usando Kate o Kwrite

Se usi Kwrite per modificare il tuo script, o il cugino più potente di Kwrite, Kate, puoi convertirlo in formato LF facendo clic su Strumenti > Fine riga > Unix.

In Kwrite, nel menu Strumenti apri "End of Line" e seleziona "Unix".

Salva il file ed esegui di nuovo lo script.

Utilizzo di Blocco note++

Se modifichi il codice in Notepad ++ puoi anche convertire facilmente i finali di riga, il che è utile perché probabilmente lo stai eseguendo su Windows (a meno che tu non abbia installato Notepad ++ per Linux) e puoi convertirli prima di passare al tuo sistema Linux. Con il file aperto, vai a Modifica > Conversione EOL > Unix (LF).

Assicurati di salvare lo script prima di eseguirlo.

Se desideri che Notepad ++ crei file con terminazioni di riga Unix per impostazione predefinita, vai su Impostazioni> Preferenze, seleziona la scheda "Nuovo documento" e sotto le opzioni "Formato (fine riga)" fai clic sul pulsante di opzione "Unix (LF)".

Utilizzo del codice VS

Visual Studio Code (VS Code) funziona più o meno allo stesso modo, solo che l'interruttore è ancora più facile da trovare. Basta fare clic su "CRLF" nell'angolo in basso a destra della finestra di VS Code.

Puoi anche impostare VS Code per utilizzare le terminazioni di riga Unix per impostazione predefinita andando su File > Preferenze > Impostazioni e digitando eol nella barra di ricerca delle impostazioni. Il primo risultato dovrebbe essere un menu a discesa per l'impostazione di "Eol". Cambialo in "\n".

Nelle impostazioni di VS Code, modifica l'impostazione EOL predefinita in "\n".

CORRELATO: Come rendere i tuoi script Bash consapevoli dell'hardware