Remediere: eroare „Interpret prost: nu există un astfel de fișier sau director” în Linux

Publicat: 2023-05-01
Persoană care tastează pe tastatura Cherry KW 9200 Mini
Hannah Stryker / How-To Geek
Dacă primiți o eroare „interpret prost: nu există un astfel de fișier sau director” atunci când rulați un script shell, trebuie să convertiți fișierul de script din Windows la sfârșiturile de linie Unix. O metodă este să utilizați comanda dos2unix , 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ă.

Cuprins

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.

Un mesaj de eroare „interpret prost: nu există un astfel de fișier sau director” într-o linie de comandă Linux.

Puteți chiar să confirmați problema într-un terminal Linux, îndreptând comanda file către scriptul dvs.

 fișierul script1.sh 

Verificați sfârșiturile de linie ale unui fișier cu comanda fișier în Linux.

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 

Introduceți comanda dos2unix.

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 

Utilizați un asterisc în comanda dvs. dos2unix pentru a converti cu un wildcard.

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 

Schimbați formatul fișierului script cu o comandă vim.

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).

În Geany, sub meniul Document, accesați „Setare sfârșit de linie” și alegeți „Convertire și setare 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.

În Kwrite, în meniul Instrumente, deschideți „Sfârșitul liniei” și selectați „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”.

În setările VS Code, modificați setarea EOL implicită la „\n”.

LEGATE: Cum să vă faceți conștient de hardware-ul pentru scripturi Bash