Poprawka: Błąd „Zły interpreter: brak takiego pliku lub katalogu” w systemie Linux

Opublikowany: 2023-05-01
Osoba pisząca na klawiaturze Cherry KW 9200 Mini
Hannah Stryker / Jak to zrobić
Jeśli podczas uruchamiania skryptu powłoki pojawi się błąd „zły interpreter: brak takiego pliku lub katalogu”, należy przekonwertować plik skryptu z końcówek linii systemu Windows na Unix. Jedną z metod jest użycie polecenia dos2unix w następujący sposób:

dos2unix script1.sh

Czy próbowałeś uruchomić skrypt Bash i otrzymałeś komunikat o błędzie „/bin/bash^M: zły interpreter: brak takiego pliku lub katalogu”? Dane wyjściowe nie są zbyt pomocne i prawie sprawiają wrażenie, że brakuje twojego skryptu. Na szczęście tak nie jest, a naprawa jest bardzo prosta.

Spis treści

Co to jest błąd „Zły interpreter: brak takiego pliku lub katalogu”?
Jak naprawić błąd „Zły interpreter: brak takiego pliku lub katalogu”.
Używając polecenia dos2unix
Używając polecenia tr
Używając polecenia sed
Używając vi lub vima
Korzystanie z Geany'ego
Korzystanie z Kate lub Kwrite
Za pomocą Notepad++
Korzystanie z kodu VS

Co to jest błąd „Zły interpreter: brak takiego pliku lub katalogu”?

Otrzymanie komunikatu o błędzie o treści /bin/bash^M: bad interpreter: No such file or directory oznacza po prostu, że plik skryptu powłoki ma niewłaściwe zakończenia linii — znaki umieszczone na końcu linii oznaczają, że czas przejść do następna linia. System Windows wywodzący się z systemu DOS lubi widzieć terminator „powrotu karetki i wysuwu wiersza” (CRLF), oznaczony jako \r\n . W przeciwieństwie do tego, Linux, nowoczesny macOS i inne systemy oparte na Uniksie używają tylko „wysuwu wiersza” (LF) lub \n .

Jeśli widzisz ten zły błąd interpretera, prawdopodobnie ty lub osoba, od której otrzymałeś skrypt, napisała go pierwotnie na komputerze z systemem Windows. Bash widzi te \r\n zakończenia linii ustawione przez komputer z systemem Windows i denerwuje się, ponieważ uniemożliwiają one powłoce prawidłową interpretację twojego skryptu.

Komunikat o błędzie „zły interpreter: brak takiego pliku lub katalogu” w wierszu poleceń systemu Linux.

Możesz nawet potwierdzić problem w terminalu Linux, wskazując polecenie file na swój skrypt.

 plik script1.sh 

Sprawdź zakończenia linii pliku za pomocą polecenia file w systemie Linux.

Jeśli plik używa zakończeń linii DOS, na wyjściu zobaczysz komunikat „z terminatorami linii CRLF”. Gdyby nasz skrypt używał właściwych znaków nowej linii systemu Unix (LF), w ogóle nie wspominałby o terminatorach. Na szczęście powrót do biznesu LF jest łatwy.

Jak naprawić błąd „Zły interpreter: brak takiego pliku lub katalogu”.

Aby pozbyć się tego komunikatu o błędzie i zacząć normalnie uruchamiać skrypty, wystarczy przełączyć się z końcówek linii DOS na końcówki linii Unix. Możesz to zrobić za pomocą poleceń terminala lub w swoim ulubionym edytorze kodu. Oto osiem sposobów, aby to naprawić:

Używając polecenia dos2unix

Istnieje program wiersza poleceń stworzony specjalnie do konwertowania plików DOS (alias Windows) na pliki w pełni zgodne z systemem Unix, trafnie nazwane dos2unix . Jest dostępny w większości domyślnych repozytoriów, więc możesz go zainstalować na Ubuntu za pomocą:

 Sudo apt zainstaluj dos2unix

W naszej instalacji Fedory dos2unix był preinstalowany, ale możesz potwierdzić, że go masz:

 sudo dnf zainstaluj dos2unix

W Arch Linuxie:

 sudo pacman -S dos2unix

Używanie dos2unix jest proste; po prostu podaj nazwę pliku.

 dos2unix script1.sh 

Wprowadź polecenie dos2unix.

Sprawdź to za pomocą file , jeśli chcesz potwierdzić, że konwersja powiodła się przed uruchomieniem skryptu. Możesz także konwertować masowo, nazywając wiele plików oddzielonych tylko spacją.

 dos2unix skrypt1.sh skrypt2.sh skrypt3.sh

Lub, jeśli masz spójne nazewnictwo plików, możesz oczywiście pisać krótsze polecenia, używając symboli wieloznacznych.

 skrypt dos2unix*.sh 

Użyj gwiazdki w poleceniu dos2unix, aby przekonwertować za pomocą symbolu wieloznacznego.

Polecenie dos2unix ma kilka flag, które pomagają w dokonywaniu specjalnych rodzajów konwersji, takich jak zmiana właściciela pliku. Możesz nawet użyć go w odwrotnej formie, unix2dos , jeśli chcesz wrócić do CRLF. Wpisz dos2unix --help aby dowiedzieć się więcej.

Używając polecenia tr

Jeśli nie możesz lub nie chcesz zainstalować dedykowanego narzędzia, Linux ma wbudowane narzędzia, które wyczyszczą te znaki nowej linii. Za pomocą polecenia tr możesz usunąć \r część zakończeń linii, tak aby pozostały \n terminatory.

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

Tutaj tr pobiera tekst pliku script1.sh , usuwając każde znalezione wystąpienie \r i zapisując dane wyjściowe jako plik script1_unix.sh .

Używając polecenia sed

Potężne polecenie sed wbudowane w twoją powłokę może również zmieniać zakończenia linii dla twojego pliku.

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

Jeśli nie jesteś zaznajomiony ze składnią sed , mówimy sed , aby edytował nasz plik ( -i ) i zastępował ( s/ ) każdy powrót karetki ( \r ) niczym. To pozostawia nam preferowane \n terminatory linii w Unixie.

Używając vi lub vima

Jeśli używasz vi lub vim do edycji swoich skryptów, po prostu przekaż to polecenie, aby przekonwertować aktualnie otwarty plik na zakończenia linii Unix.

 :ustaw format pliku=unix 

Zmień format pliku skryptu za pomocą polecenia vim.

POWIĄZANE: Jak wyjść z edytora Vi lub Vim

Korzystanie z Geany'ego

Jeśli pracujesz w środowisku komputerowym, nie ma powodu, aby wygłupiać się w terminalu tylko po to, aby przygotować pliki do świata Unix. Praktycznie każdy edytor kodu i IDE ma przełącznik zakończeń linii. Obejmuje to Geany'ego.

Aby przekonwertować zakończenia linii w Geany, przejdź do Dokument > Ustaw zakończenia linii > Konwertuj i ustaw na LF (Unix).

W Geany, w menu Dokument, przejdź do „Ustaw zakończenia linii” i wybierz „Konwertuj i ustaw na LF (Unix)”.

Zapisz skrypt i spróbuj uruchomić go ponownie.

Korzystanie z Kate lub Kwrite

Jeśli używasz Kwrite do edycji skryptu lub potężniejszej kuzynki Kwrite, Kate, możesz przekonwertować do formatu LF, klikając Narzędzia > Koniec linii > Unix.

W Kwrite, w menu Narzędzia otwórz „Koniec linii” i wybierz „Unix”.

Zapisz plik i ponownie uruchom skrypt.

Za pomocą Notepad++

Jeśli edytujesz kod w Notepad ++, możesz również łatwo konwertować zakończenia linii, co jest przydatne, ponieważ prawdopodobnie używasz go w systemie Windows (chyba że zainstalowałeś Notepad ++ dla systemu Linux) i możesz je przekonwertować przed przejściem do systemu Linux. Po otwarciu pliku przejdź do Edycja > Konwersja EOL > Unix (LF).

Pamiętaj, aby zapisać skrypt przed jego uruchomieniem.

Jeśli chcesz, aby Notepad ++ domyślnie tworzył pliki z zakończeniami linii Unix, przejdź do Ustawienia> Preferencje, wybierz kartę „Nowy dokument”, aw opcjach „Format (koniec linii)” kliknij przycisk radiowy „Unix (LF)”.

Korzystanie z kodu VS

Visual Studio Code (VS Code) działa w ten sam sposób, tylko przełącznik jest jeszcze łatwiejszy do znalezienia. Po prostu kliknij „CRLF” w prawym dolnym rogu okna VS Code.

Możesz także ustawić VS Code, aby domyślnie używał zakończeń linii Unix, przechodząc do Plik> Preferencje> Ustawienia i wpisując eol w pasku wyszukiwania ustawień. Górnym wynikiem powinno być rozwijane menu do ustawiania „Eol”. Zmień go na „\ n”.

W ustawieniach programu VS Code zmień domyślne ustawienie EOL na „\n”.

POWIĄZANE: Jak sprawić, by skrypty Bash były świadome sprzętu