it-swarm.com.de

Eine .sh-Datei kann nicht ausgeführt werden: / bin / bash ^ M: falscher Interpreter

Ich wollte ein Shell-Skript ausführen:

-rwxr-x--x 1 root root   17234 Jun  6 18:31 create_mgw_3shelf_6xIPNI1P.sh

Ich habe versucht, eine Standardprozedur durchzuführen, habe jedoch den folgenden Fehler erhalten:

./create_mgw_3shelf_6xIPNI1P.sh 
localhost 389 -l /opt/fews/sessions/AMGWM19/log/2013-06-06-143637_CLA-0 
DEBUG   cd/etc/opt/ldapfiles/ldif_in ;
./create_mgw_3shelf_6xIPNI1P.sh 
localhost 389 -l /opt/fews/sessions/AMGWM19/log/2013-06-06-143637_CLA-0
**ERROR  sh: ./create_mgw_3shelf_6xIPNI1P.sh: /bin/bash^M: bad interpreter: No such file or directory**

Was heißt das? Ich habe dies als Benutzer root in der Gruppe root ausgeführt.

Bedeutet dies, dass die Datei nicht die richtige Berechtigung für den Benutzer root hat?

99
user165062

Dies ist kein Berechtigungsproblem. Sie erhalten keine Nachricht über Berechtigungen

/bin/bash^M: bad interpreter: No such file or directory

Das Skript gibt an, dass es von einer Shell ausgeführt werden muss, die sich unter /bin/bash^M befindet. Es gibt keine solche Datei: Sie heißt /bin/bash.

Der ^M ist ein Wagenrücklaufzeichen . Linux verwendet das Zeilenvorschubzeichen , um das Ende einer Zeile zu markieren, während Windows die zweistellige Sequenz CR LF verwendet. Ihre Datei hat Windows-Zeilenenden, was Linux verwirrt.

Entfernen Sie die falschen CR-Zeichen. Sie können dies mit dem folgenden Befehl tun:

sed -i -e 's/\r$//' create_mgw_3shelf_6xIPNI1P.sh
175
Gilles

In vim können Sie auch :set ff=unix verwenden und dann die Datei speichern, oder :set ff=dos, um die DOS-Formatierung erneut abzurufen.

22
ortang

Ihre Datei hat DOS/Windows-Zeilenenden (CR LF) , aber auf Unix-ähnlichen Systemen nur das WENN DAS STEUERZEICHEN als Zeilenumbruch verwendet wird.

Das zusätzliche CR Steuerzeichen wird in Ihrer Ausgabe als ^M codiert angezeigt. Sie können es auch sehen, wenn Sie cat -A create_mgw_3shelf_6xIPNI1P.sh ausführen.

Um die Zeilenenden vom DOS/Windows-Stil in den Unix-Stil umzuwandeln, gibt es ein Tool namens dos2unix. Sie installieren es mit:

Sudo apt-get install dos2unix

Dann können Sie einfach die Zeilenenden der Dateien mit in beide Richtungen konvertieren

dos2unix FILENAME
unix2dos FILENAME

Führen Sie in Ihrem Fall einfach den folgenden Befehl aus, und die Skriptdatei wird direkt konvertiert:

dos2unix create_mgw_3shelf_6xIPNI1P.sh

Danach sollte Bash die Datei korrekt interpretieren können.

17
Byte Commander

Das Problem ist, Sie bearbeiten mit Dos!

öffne deine Datei mit vi und setze dann Unix mit:

:set ff=unix
:wq

und alles in Ordnung

5
DaFreder

Mach vi <your script>.

dann :set list; Es werden alle Sonderzeichen in Ihrem Skript angezeigt.

dann ersetze das Zeichen:

:%s/^M//gc [um ^M einzugeben, drücken Sie Ctrl + v + m]

4
Pankaj Sain

Wie in den anderen Antworten erläutert, handelt es sich hierbei um ein Formatproblem. Die Antwort ist also, das Format von DOS auf Zeilenenden im Unix-Stil zu ändern. Dies ist eine weitere einfache Möglichkeit, Ihre Datei zu reparieren.

fromdos file

Es ist im Paket tofrodos verfügbar:

Sudo apt-get install tofrodos
4
josediazaz

Sie können auch gedit verwenden, um unerwünschte Zeichen zu entfernen. Wählen Sie im Menü Datei die Option Speichern unter und legen Sie den Zeilenende-Typ Unix/Linux fest.

2
tphistry