Correzione: errore "Cattivo interprete: nessun file o directory di questo tipo" in Linux
Pubblicato: 2023-05-01dos2unix
, 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.
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.
Puoi persino confermare il problema in un terminale Linux puntando il comando file
al tuo script.
file script1.sh
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
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
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
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).
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.
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".
CORRELATO: Come rendere i tuoi script Bash consapevoli dell'hardware