Vraag Niet in staat om een ​​.sh-bestand uit te voeren: / bin / bash ^ M: slechte interpreter


Ik wilde een shellscript uitvoeren:

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

Ik heb geprobeerd een standaardprocedure uit te voeren, maar ik kreeg deze foutmelding:

./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**

Wat betekent het? Ik deed dit als de root gebruiker onder de root groep.

Betekent dit dat het bestand niet de juiste toestemming heeft voor de root gebruiker?


72
2018-06-06 20:17


oorsprong




antwoorden:


Dit is geen kwestie van rechten, u krijgt geen bericht over rechten

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

Het script geeft aan dat het moet worden uitgevoerd door een shell op /bin/bash^M. Er is geen bestand: het is gebeld /bin/bash.

De ^M is een carriage return karakter. Linux gebruikt de regelinvoerkarakter om het einde van een regel aan te geven, terwijl Windows de CR LF-reeks met twee tekens gebruikt. Uw bestand heeft Windows-regeleinden, wat Linux verwarrend maakt.

Verwijder de onechte CR-tekens. U kunt het doen met de volgende opdracht:

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

127
2018-06-06 20:25



Of installeer en gebruik de dos2unix programma. - argentpepper
Bedankt hiervoor, alle andere antwoorden die ik tot nu toe heb gevonden, hebben niet geholpen. Deze deed het! - qodeninja
hoeft geen Windows te zijn, ik kreeg een soortgelijk bericht na het kopiëren van een script van OS X naar Ubuntu ... dos2unix werkte in dat geval geweldig, terwijl vervanging van '\ r' door niets erger zou zijn, omdat er geen '\ n 'tekens in het bestand. - Michael
@Michael macOS gebruikt \n omdat het Unix is. Het script was misschien van een eerdere Mac OS-versie? Je zou kunnen vluchten sed -i -e 's/\r$/\n/' script.shin dat geval. - wjandrea
Open het in gedit en, sla op als, en selecteer "Line Ending: Unix / Linux" - Mattmon


In vim zou je ook kunnen gebruiken :set ff=unix en sla het bestand op, of :set ff=dos om DOS-formattering opnieuw te krijgen.


15
2018-06-07 08:33



deze deed het voor mij, Thx - bunkerdive


Uw bestand heeft DOS / Windows-stijl regeleinden (CR LF), maar op Unix-achtige systemen alleen de LF controleteken wordt gebruikt als regeleinde.

De aanvullende CR controle karakter wordt gecodeerd weergegeven als ^M in uw uitvoer. Je kunt het ook zien als je rent cat -A create_mgw_3shelf_6xIPNI1P.sh.

Om de lijnuitgangen van DOS / Windows-stijl naar Unix-stijl te converteren, is er een tool genaamd dos2unix. U installeert het met behulp van:

sudo apt-get install dos2unix

Vervolgens kunt u de regeluitgangen van bestanden eenvoudigweg op beide manieren converteren met

dos2unix FILENAME
unix2dos FILENAME

Voer in uw geval deze onderstaande opdracht uit en het scriptbestand wordt ter plekke geconverteerd:

dos2unix create_mgw_3shelf_6xIPNI1P.sh

Daarna zou Bash het bestand correct kunnen interpreteren.


10
2017-12-15 20:31





Zoals uitgelegd in de andere antwoorden, is dit een formatiekwestie. Dus, het antwoord is om het formaat te veranderen van DOS naar Unix-stijl regeleinden. Dit is nog een andere eenvoudige manier om uw bestand 'op zijn plaats' te herstellen

fromdos file

Het is beschikbaar in pakket tofrodos:

sudo apt-get install tofrodos

4
2018-06-07 22:50





Do vi <your script>.

dan :set list; het toont alle speciale tekens in uw script.

vervang dan het karakter:

:%s/^M//gc           [typen ^M druk op Ctrl + v + m]


3
2018-06-07 07:41



Zie het bovenstaande antwoord over het gebruik van: fileformat dat IMHO beter is om dit aan te pakken dan globale vervanging. Zie ook stackoverflow.com/questions/14609779/... voor ideeën over hoe om te gaan met automatisch - qneill


U kunt ook gedit gebruiken om de ongewenste tekens te verwijderen. Selecteer Opslaan als in het menu Bestand en stel het lijneindtype unix / Linux in.


2
2017-12-03 02:40



+1 hiervoor omdat het me hielp met MacOS-regeleinden. - Bobble


Het probleem is dat je bewerkt met Dos!

open je bestand met vi stel vervolgens unix in met:

:set ff=unix
:wq

en het gaat goed


2
2018-04-28 16:29