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

107

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 tat dies als rootBenutzer unter der rootGruppe.

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

user165062
quelle

Antworten:

182

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 unter ausgeführt werden muss /bin/bash^M. Es gibt keine solche Datei: Sie heißt /bin/bash.

Das ^Mist 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
Gilles
quelle
22
Oder installieren und benutzen Sie das dos2unixProgramm.
Argentpepper
4
Vielen Dank dafür, alle anderen Antworten, die ich bisher gefunden habe, haben nicht geholfen. Dieser hat es geschafft!
Qodeninja
muss nicht Windows sein, ich habe eine ähnliche Meldung erhalten, nachdem ich ein Skript von OS X nach Ubuntu kopiert habe ... dos2unix hat in diesem Fall hervorragend funktioniert, wohingegen das Ersetzen von '\ r' durch nichts schlimmer wäre, da es keine '\' gibt. n 'Zeichen in der Datei.
Michael
1
@ Michael MacOS verwendet, \nweil es Unix ist. Das Skript stammt möglicherweise aus einer früheren Mac OS-Version? Sie könnten sed -i -e 's/\r$/\n/' script.shin diesem Fall laufen .
wjandrea
1
Öffne es in gedit und, speichere es unter und wähle "
Zeilenende
23

In vim können Sie auch :set ff=unixdie Datei verwenden und dann speichern oder :set ff=dosdie DOS-Formatierung erneut abrufen.

ortang
quelle
dieser hat es für mich getan, thx
bunkerdive 06.08.15
19

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

Das zusätzliche CR- Steuerzeichen wird wie ^Min Ihrer Ausgabe codiert angezeigt . Sie können es auch sehen, wenn Sie laufen cat -A create_mgw_3shelf_6xIPNI1P.sh.

Um die Zeilenenden vom DOS / Windows-Stil in den Unix-Stil zu konvertieren, 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.

Byte Commander
quelle
1
Dank dessen ist dos2unix auch für macOS über brew verfügbar.
Muhammad Annaqeeb
5

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

DaFreder
quelle
4

Tun vi <your script>.

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

dann ersetze das Zeichen:

:%s/^M//gc [um zu tippen, ^Mdrücke Ctrl+ v+ m]

Pankaj Sain
quelle
Siehe obige Antwort zur Verwendung von: fileformat, das meiner Meinung nach besser dafür geeignet ist als die globale Ersetzung. Weitere Informationen zur automatischen
Verarbeitung finden Sie unter stackoverflow.com/questions/14609779/…
4

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 erhältlich tofrodos:

sudo apt-get install tofrodos
josediazaz
quelle
2

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.

tphistry
quelle
+1 dafür, weil es mir bei MacOS-Zeilenenden geholfen hat.
Bobble