Fix: Fehler „Bad Interpreter: No Such File or Directory“ unter Linux
Veröffentlicht: 2023-05-01dos2unix
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.
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.
Sie können das Problem sogar in einem Linux-Terminal bestätigen, indem Sie den file
auf Ihr Skript verweisen.
Datei script1.sh
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
Ü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
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
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).
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.
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“.
VERWANDT: So machen Sie Ihre Bash-Skripte Hardware-fähig