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


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 von dos2unix Befehl, etwa so:

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.

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

Eine Fehlermeldung erhalten, die lautet /bin/bash^M: bad interpreter: No such file or directory bedeutet nur, dass Ihre Shell-Skriptdatei die falsche enthält Zeilenenden– die Zeichen am Ende einer Zeile, die anzeigen, dass es Zeit ist, zur nächsten Zeile zu wechseln. Von DOS abstammendes Windows sieht gerne ein CRLF-Endzeichen (Wagenrücklauf und Zeilenvorschub) in Notation \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 werden, und ärgert sich, weil sie die Shell daran hindern, Ihr Skript richtig zu interpretieren.

A

Sie können das Problem sogar in einem Linux-Terminal bestätigen, indem Sie auf zeigen file Befehl zu Ihrem Skript.

file 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 treffendem Namen erstellt wurde dos2unix. Es ist in den meisten Standard-Repositories verfügbar, sodass Sie es unter Ubuntu installieren können mit:

sudo apt install dos2unix

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

sudo dnf install dos2unix

Unter Arch-Linux:

sudo pacman -S dos2unix

Verwenden 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 script*.sh

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

Der dos2unix Der Befehl verfügt über mehrere Flags, mit denen Sie spezielle Arten von Konvertierungen durchführen können, z. B. das Ändern des Dateibesitzes. Sie können es sogar in umgekehrter Form verwenden, unix2dos, wenn Sie zurück zu CRLF wechseln möchten. Eingeben dos2unix --help um mehr zu lernen.

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 die entfernen \r ein Teil der Zeilen endet, also bleiben wir übrig \n Terminatoren.

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

Hier, tr nimmt den Text der script1.sh Datei, wobei jede Instanz von gelöscht wird \r es findet und die Ausgabe als Datei speichert script1_unix.sh.

Verwenden des sed-Befehls

Der mächtige sed Der in Ihre Shell eingebaute Befehl kann auch Zeilenenden für Ihre Datei ändern.

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

Wenn Sie nicht vertraut sind sed Syntax, sagen wir sed um unsere Datei zu bearbeiten (-i) und ersetzen (s/) jeder Wagenrücklauf (\r) mit nichts. Das lässt uns mit Unix’s bevorzugt \n Leitungsabschluss.

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

Speichern Sie Ihr Skript und versuchen Sie es erneut.

Mit Kate oder Kwrite

Wenn du benutzt Kwrite um Ihr Skript zu bearbeiten, oder der mächtigere Cousin von Kwrite Katekönnen Sie in das LF-Format konvertieren, indem Sie auf Extras > Zeilenende > Unix klicken.

Öffnen Sie in Kwrite das Menü Extras

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 installiertes Notepad++ für Linux) und kann sie konvertieren, bevor Sie zu Ihrem Linux-System wechseln. Gehen Sie bei geöffneter Datei zu Bearbeiten > EOL-Konvertierung > Unix (LF).

Stellen Sie sicher, dass Sie Ihr Skript 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 eingeben eol in der Suchleiste der Einstellungen. 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

VERWANDT: So machen Sie Ihre Bash-Skripte hardwarebewusst



source-107

Leave a Reply