Fix: Fehler „Bad Interpreter: No Such File or Directory“ unter Linux

Veröffentlicht: 2023-05-01
Person, die auf der Cherry KW 9200 Mini-Tastatur tippt
Hannah Stryker / How-to-Geek
Wenn Sie beim Ausführen eines Shell-Skripts den Fehler „Bad Interpreter: no such file or directory“ erhalten, müssen Sie Ihre Skriptdatei von Windows- in Unix-Zeilenenden konvertieren. Eine Methode ist die Verwendung des dos2unix Befehls wie folgt:

dos2unix script1.sh

Haben Sie versucht, ein Bash-Skript auszuführen, und die Fehlermeldung „/bin/bash^M: Bad Interpreter: No such file or directory“ erhalten? Die Ausgabe ist nicht sehr hilfreich und vermittelt fast den Eindruck, dass Ihr Skript fehlt. Glücklicherweise ist das nicht der Fall, und die Lösung ist sehr einfach.

Inhaltsverzeichnis

Was ist der Fehler „Schlechter Interpreter: Keine solche Datei oder Verzeichnis“?
So beheben Sie den Fehler „Schlechter Interpreter: Keine solche Datei oder kein solches Verzeichnis“.
Mit dem dos2unix-Befehl
Verwenden des tr-Befehls
Verwenden des sed-Befehls
Mit vi oder vim
Mit Geany
Mit Kate oder Kwrite
Mit Notepad++
Verwenden von VS-Code

Was ist der Fehler „Schlechter Interpreter: Keine solche Datei oder Verzeichnis“?

Wenn Sie eine Fehlermeldung erhalten, die lautet /bin/bash^M: bad interpreter: No such file or directory bedeutet dies nur, dass Ihre Shell-Skriptdatei die falschen Zeilenenden hat – die Zeichen am Ende einer Zeile zeigen an, dass es Zeit ist, zu dem zu wechseln nächste Zeile. Von DOS abstammendes Windows sieht gerne ein „Wagenrücklauf und Zeilenvorschub“ (CRLF)-Terminator, notiert \r\n . Im Gegensatz dazu verwenden Linux, modernes macOS und andere Unix-basierte Systeme nur „Zeilenvorschub“ (LF) oder \n .

Wenn Sie diesen schlechten Interpreterfehler sehen, haben Sie oder die Person, von der Sie das Skript erhalten haben, es wahrscheinlich ursprünglich auf einem Windows-Computer geschrieben. Bash sieht diese \r\n -Zeilenenden, die vom Windows-Computer gesetzt wurden, und regt sich auf, weil sie verhindern, dass die Shell Ihr Skript richtig interpretiert.

Eine Fehlermeldung „Bad Interpreter: no such file or directory“ in einer Linux-Befehlszeile.

Sie können das Problem sogar in einem Linux-Terminal bestätigen, indem Sie den file auf Ihr Skript verweisen.

 Datei script1.sh 

Überprüfen Sie die Zeilenenden einer Datei mit dem file-Befehl in Linux.

Wenn die Datei DOS-Zeilenenden verwendet, wird die Meldung „mit CRLF-Zeilenabschlusszeichen“ an die Ausgabe angehängt. Hätte unser Skript die richtigen Unix-Zeilenumbrüche (LF) verwendet, würde es überhaupt keine Terminatoren erwähnen. Glücklicherweise ist es einfach, wieder ins LF-Geschäft einzusteigen.

So beheben Sie den Fehler „Bad Interpreter: No Such File or Directory“.

Alles, was Sie brauchen, um diese Fehlermeldung loszuwerden und Ihre Skripte wie gewohnt auszuführen, ist der Wechsel von DOS-Zeilenenden zu Unix-Zeilenenden. Sie können dies mit Terminalbefehlen oder in Ihrem bevorzugten Code-Editor tun. Hier sind acht Möglichkeiten, das Problem zu beheben:

Mit dem dos2unix-Befehl

Es gibt ein Befehlszeilenprogramm, das nur zum Konvertieren von DOS-Dateien (alias Windows) in vollständig Unix-kompatible Dateien mit dem treffenden Namen dos2unix erstellt wurde. Es ist in den meisten Standard-Repositories verfügbar, sodass Sie es unter Ubuntu installieren können mit:

 sudo apt installiere dos2unix

Auf unserer Fedora-Installation war dos2unix vorinstalliert, aber Sie können bestätigen, dass Sie es haben mit:

 sudo dnf installiere dos2unix

Unter Arch-Linux:

 sudo pacman -S dos2unix

Die Verwendung von dos2unix ist einfach; Geben Sie ihm einfach Ihren Dateinamen.

 dos2unix script1.sh 

Geben Sie den dos2unix-Befehl ein.

Überprüfen Sie es mit file , wenn Sie bestätigen möchten, dass die Konvertierung erfolgreich war, bevor Sie Ihr Skript ausführen. Sie können auch eine Massenkonvertierung durchführen, indem Sie mehrere Dateien benennen, die nur durch ein Leerzeichen getrennt sind.

 dos2unix script1.sh script2.sh script3.sh

Oder, wenn Sie konsistente Dateinamen haben, können Sie natürlich kürzere Befehle mit Platzhaltern schreiben.

 dos2unix-Skript*.sh 

Verwenden Sie ein Sternchen in Ihrem dos2unix-Befehl, um mit einem Platzhalter zu konvertieren.

Der Befehl dos2unix hat mehrere Flags, die Ihnen helfen, spezielle Arten von Konvertierungen durchzuführen, wie z. B. das Ändern des Dateibesitzes. Sie können es sogar in umgekehrter Form, unix2dos , verwenden, wenn Sie zurück zu CRLF wechseln möchten. Geben Sie dos2unix --help ein, um mehr zu erfahren.

Verwenden des tr-Befehls

Wenn Sie kein dediziertes Dienstprogramm installieren können oder wollen, verfügt Linux über integrierte Tools, die diese Zeilenumbrüche bereinigen. Mit dem tr Befehl können Sie den \r Teil der Zeilenenden entfernen, sodass \n Abschlusszeichen übrig bleiben.

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

Hier nimmt tr den Text der Datei script1.sh , löscht jede gefundene Instanz von \r und speichert die Ausgabe als Datei script1_unix.sh .

Verwenden des sed-Befehls

Der mächtige sed -Befehl, der in Ihre Shell eingebaut ist, kann auch Zeilenenden für Ihre Datei ändern.

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

Wenn Sie mit sed Syntax nicht vertraut sind, weisen wir sed an, unsere Datei zu bearbeiten ( -i ) und jeden Wagenrücklauf ( \r ) durch nichts zu ersetzen ( s/ ). Damit bleiben uns die bevorzugten \n Zeilenabschlusszeichen von Unix.

Mit vi oder vim

Wenn Sie vi oder vim verwenden, um Ihre Skripte zu bearbeiten, übergeben Sie einfach diesen Befehl, um die aktuell geöffnete Datei in Unix-Zeilenenden zu konvertieren.

 :set fileformat=unix 

Ändern Sie das Skriptdateiformat mit einem vim-Befehl.

VERWANDT: So beenden Sie den Vi- oder Vim-Editor

Mit Geany

Wenn Sie in einer Desktop-Umgebung arbeiten, gibt es keinen Grund, im Terminal herumzuspielen, nur um Ihre Dateien für die Unix-Welt vorzubereiten. Praktisch jeder Code-Editor und jede IDE da draußen hat einen Schalter für Zeilenenden. Dazu gehört Geany.

Um Zeilenenden in Geany zu konvertieren, gehen Sie zu Dokument > Zeilenenden setzen > Konvertieren und auf LF setzen (Unix).

Gehen Sie in Geany im Menü „Dokument“ zu „Zeilenenden festlegen“ und wählen Sie „Konvertieren und auf LF setzen (Unix)“.

Speichern Sie Ihr Skript und versuchen Sie es erneut.

Mit Kate oder Kwrite

Wenn Sie Kwrite verwenden, um Ihr Skript zu bearbeiten, oder die leistungsfähigere Cousine von Kwrite, Kate, können Sie in das LF-Format konvertieren, indem Sie auf Extras > Zeilenende > Unix klicken.

Öffnen Sie in Kwrite im Menü „Tools“ „End of Line“ und wählen Sie „Unix“.

Speichern Sie die Datei und führen Sie Ihr Skript erneut aus.

Mit Notepad++

Wenn Sie Code in Notepad++ bearbeiten, können Sie auch Zeilenenden einfach konvertieren, was praktisch ist, da Sie es wahrscheinlich unter Windows ausführen (es sei denn, Sie haben Notepad++ für Linux installiert) und sie konvertieren können, bevor Sie zu Ihrem Linux-System wechseln. Gehen Sie bei geöffneter Datei zu Bearbeiten > EOL-Konvertierung > Unix (LF).

Achten Sie darauf, Ihr Skript zu speichern, bevor Sie es ausführen.

Wenn Sie möchten, dass Notepad ++ standardmäßig Dateien mit Unix-Zeilenenden erstellt, gehen Sie zu Einstellungen > Einstellungen, wählen Sie die Registerkarte „Neues Dokument“ und klicken Sie unter den Optionen „Format (Zeilenende)“ auf das Optionsfeld „Unix (LF)“.

Verwenden von VS-Code

Visual Studio Code (VS Code) funktioniert ähnlich, nur dass der Schalter noch einfacher zu finden ist. Klicken Sie einfach auf „CRLF“ in der unteren rechten Ecke des VS Code-Fensters.

Sie können VS Code auch so einstellen, dass standardmäßig Unix-Zeilenenden verwendet werden, indem Sie zu Datei > Einstellungen > Einstellungen gehen und eol in die Suchleiste der Einstellungen eingeben. Das oberste Ergebnis sollte ein Dropdown-Menü zum Einstellen des „Eol“ sein. Ändern Sie es in „\n“.

Ändern Sie in den VS-Code-Einstellungen die Standard-EOL-Einstellung in „\n“.

VERWANDT: So machen Sie Ihre Bash-Skripte Hardware-fähig