Remediere: eroare „Interpret prost: nu există un astfel de fișier sau director” în Linux
Publicat: 2023-05-01dos2unix
, astfel:dos2unix script1.sh
Ați încercat să rulați un script Bash și ați primit un mesaj de eroare „/bin/bash^M: bad interpreter: No such file or directory”? Ieșirea nu este foarte utilă și aproape dă impresia că scriptul tău lipsește. Din fericire, nu este cazul, iar remedierea este foarte simplă.
Ce este eroarea „Interpret prost: nu există un astfel de fișier sau director”?
Cum să remediați o eroare „Interpret prost: nu există un astfel de fișier sau director”.
Folosind comanda dos2unix
Folosind comanda tr
Folosind comanda sed
Folosind vi sau vim
Folosind Geany
Folosind Kate sau Kwrite
Folosind Notepad++
Folosind codul VS
Ce este eroarea „Interpret prost: nu există un astfel de fișier sau director”?
Primirea unui mesaj de eroare care citește /bin/bash^M: bad interpreter: No such file or directory
înseamnă doar că fișierul dvs. de script shell are sfârșituri de linie greșite - caracterele plasate la sfârșitul unei linii indicând că este timpul să treceți la rândul următor. Windows descendent din DOS îi place să vadă un terminator „retur caruș și avans de linie” (CRLF), notat \r\n
. În schimb, Linux, macOS modern și alte sisteme bazate pe Unix folosesc doar „line feed” (LF) sau \n
.
Dacă vedeți această eroare proastă de interpret, este posibil ca fie dvs., fie persoana de la care ați primit scriptul să l-ați scris inițial pe un computer Windows. Bash vede acele \r\n
sfârșituri de rând setate de computerul Windows și se supără pentru că împiedică shell-ul să interpreteze corect scriptul.
Puteți chiar să confirmați problema într-un terminal Linux, îndreptând comanda file
către scriptul dvs.
fișierul script1.sh
Dacă fișierul folosește sfârșituri de linie DOS, veți vedea mesajul „cu terminatori de linie CRLF” atașat în rezultat. Dacă scriptul nostru ar fi folosit liniile noi Unix (LF), nu ar menționa deloc terminatorii. Din fericire, revenirea în afacerea LF este ușor.
Cum să remediați o eroare „Interpret prost: nu există un astfel de fișier sau director”.
Tot ceea ce este nevoie pentru a scăpa de acel mesaj de eroare și a începe să rulați scripturile în mod normal este să treceți de la sfârșiturile de linie DOS la sfârșiturile de linie Unix. Puteți face acest lucru cu comenzile terminalului sau în editorul de cod preferat. Iată opt moduri de a o remedia:
Folosind comanda dos2unix
Există un program de linie de comandă creat doar pentru conversia fișierelor DOS (alias, Windows) în fișiere complet compatibile cu Unix, numite în mod adecvat dos2unix
. Este disponibil în majoritatea depozitelor implicite, așa că îl puteți instala pe Ubuntu cu:
sudo apt install dos2unix
Pe instalarea noastră Fedora, dos2unix
a venit preinstalat, dar puteți confirma că îl aveți cu:
sudo dnf install dos2unix
Pe Arch Linux:
sudo pacman -S dos2unix
Utilizarea dos2unix
este simplă; dă-i doar numele fișierului tău.
dos2unix script1.sh
Verificați-l cu file
dacă doriți să confirmați că conversia a avut succes înainte de a rula scriptul. De asemenea, puteți face conversii în masă prin denumirea mai multor fișiere separate doar de un spațiu.
dos2unix script1.sh script2.sh script3.sh
Sau, dacă aveți o denumire consecventă a fișierelor, puteți, desigur, să scrieți comenzi mai scurte folosind caractere joker.
dos2unix script*.sh
Comanda dos2unix
are mai multe indicatoare pentru a vă ajuta să faceți tipuri speciale de conversii, cum ar fi schimbarea proprietății fișierului. Îl puteți folosi chiar și în formă inversă, unix2dos
, dacă doriți să treceți înapoi la CRLF. Introduceți dos2unix --help
pentru a afla mai multe.
Folosind comanda tr
Dacă nu puteți sau nu doriți să instalați un utilitar dedicat, Linux are instrumente încorporate care vor curăța acele linii noi. Cu comanda tr
, puteți elimina partea \r
a sfârșiturilor de linie, așa că rămânem cu \n
terminatori.
tr -d '\r' < script1.sh > script1_unix.sh
Aici, tr
preia textul fișierului script1.sh
, șterge fiecare instanță de \r
pe care o găsește și salvează rezultatul ca fișier script1_unix.sh
.
Folosind comanda sed
Comanda puternică sed
încorporată în shell-ul dvs. poate schimba, de asemenea, sfârșiturile de linie pentru fișierul dvs.
sed -i 's/\r//' script1.sh
Dacă nu sunteți familiarizat cu sintaxa sed
, îi spunem lui sed
să ne editeze fișierul ( -i
) și să înlocuiască ( s/
) fiecare întoarcere de cărucior ( \r
) cu nimic. Asta ne lasă cu terminatorii de linie \n
preferati de Unix.
Folosind vi sau vim
Dacă utilizați vi sau vim pentru a vă edita scripturile, transmiteți această comandă pentru a converti fișierul deschis în prezent la sfârșiturile de linie Unix.
:set fileformat=unix
LEGATE: Cum să ieși din editorul Vi sau Vim
Folosind Geany
Dacă lucrezi într-un mediu desktop, nu există niciun motiv să te prostești în terminal doar pentru a-ți pregăti fișierele pentru lumea Unix. Practic, fiecare editor de cod și IDE de acolo au o comutare pentru sfârșitul liniilor. Asta o include pe Geany.
Pentru a converti sfârșiturile de linie în Geany, accesați Document > Setează sfârșiturile de linie > Convertiți și setați la LF (Unix).
Salvați scriptul și încercați să-l rulați din nou.
Folosind Kate sau Kwrite
Dacă utilizați Kwrite pentru a vă edita scriptul sau verișoara mai puternică a lui Kwrite, Kate, puteți converti în format LF făcând clic pe Instrumente > Sfârșit de linie > Unix.
Salvați fișierul și rulați din nou scriptul.
Folosind Notepad++
Dacă editați codul în Notepad++, puteți, de asemenea, să convertiți cu ușurință terminațiile de linie, ceea ce este la îndemână deoarece probabil îl rulați pe Windows (cu excepția cazului în care ați instalat Notepad++ pentru Linux) și le puteți converti înainte de a vă muta pe sistemul dvs. Linux. Cu fișierul deschis, accesați Editare > Conversie EOL > Unix (LF).
Asigurați-vă că salvați scriptul înainte de al rula.
Dacă doriți ca Notepad++ să creeze fișiere cu sfârșit de linie Unix în mod implicit, accesați Setări > Preferințe, selectați fila „Document nou”, iar sub opțiunile „Format (terminare de linie)” faceți clic pe butonul radio „Unix (LF)”.
Folosind codul VS
Codul Visual Studio (VS Code) funcționează aproape în același mod, doar comutatorul este și mai ușor de găsit. Doar faceți clic pe „CRLF” în colțul din dreapta jos al ferestrei VS Code.
De asemenea, puteți seta VS Code să folosească finalurile de linie Unix în mod implicit, accesând Fișier > Preferințe > Setări și tastând eol
în bara de căutare a setărilor. Rezultatul de sus ar trebui să fie un meniu derulant pentru setarea „Eol”. Schimbați-l în „\n”.
LEGATE: Cum să vă faceți conștient de hardware-ul pentru scripturi Bash