Nie można wykonać pliku .sh: / bin / bash ^ M: zły interpreter

107

Chciałem wykonać skrypt powłoki:

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

Próbowałem wykonać standardową procedurę, ale dostałem ten błąd:

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

Co to znaczy? Robiłem to jako rootużytkownik w rootgrupie.

Czy to oznacza, że ​​plik nie ma odpowiednich uprawnień dla rootużytkownika?

użytkownik165062
źródło

Odpowiedzi:

182

To nie jest problem z uprawnieniami, nie otrzymujesz wiadomości o uprawnieniach

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

Skrypt wskazuje, że musi zostać wykonany przez powłokę znajdującą się w /bin/bash^M. Nie ma takiego pliku: nazywa się /bin/bash.

^MTo znak powrotu karetki . Linux używa znaku końca linii do oznaczenia końca linii, podczas gdy Windows używa dwuznakowej sekwencji CR LF. Twój plik ma zakończenia linii systemu Windows, co dezorientuje system Linux.

Usuń fałszywe znaki CR. Możesz to zrobić za pomocą następującego polecenia:

sed -i -e 's/\r$//' create_mgw_3shelf_6xIPNI1P.sh
Gilles
źródło
22
Lub zainstaluj i użyj dos2unixprogramu.
argentpepper
4
dziękuję za to, wszystkie inne odpowiedzi, które do tej pory znalazłem, nie pomogły. Ten to zrobił!
qodeninja
nie musi to być Windows, dostałem podobny komunikat po skopiowaniu skryptu z OS X na Ubuntu ... dos2unix działał świetnie w tym przypadku, podczas gdy zamiana „\ r” na nic nie byłaby gorsza, ponieważ nie ma „\ n 'znaków w pliku.
Michael
1
@Michael macOS używa, \nponieważ jest to system uniksowy. Skrypt był może z wcześniejszej wersji systemu Mac OS? W sed -i -e 's/\r$/\n/' script.shtakim przypadku możesz biec .
wjandrea
1
Otwórz go w gedit i zrób Save As, a następnie wybierz „Line Ending: Unix / Linux”
Mattmon
23

W vimie możesz również użyć, :set ff=unixa następnie zapisać plik lub :set ff=dosponownie uzyskać formatowanie DOS.

ortang
źródło
ten zrobił to dla mnie, thx
bunkerdive
19

Twój plik ma zakończenia linii w stylu DOS / Windows (CR LF) , ale w systemach uniksowych tylko znak kontrolny LF jest używany jako podział linii.

Dodatkowy znak kontrolny CR jest zakodowany jak ^Mna wydruku. Możesz to również zobaczyć po uruchomieniu cat -A create_mgw_3shelf_6xIPNI1P.sh.

Aby przekonwertować zakończenia linii ze stylu DOS / Windows na styl Unix, istnieje narzędzie o nazwie dos2unix. Instalujesz go za pomocą:

sudo apt-get install dos2unix

Następnie możesz po prostu konwertować zakończenia linii plików na dwa sposoby, używając

dos2unix FILENAME
unix2dos FILENAME

W twoim przypadku po prostu uruchom poniższe polecenie, a plik skryptu zostanie przekonwertowany w miejscu:

dos2unix create_mgw_3shelf_6xIPNI1P.sh

Po tym Bash powinien być w stanie poprawnie zinterpretować plik.

Bajt Dowódca
źródło
1
Dzięki, dos2unix jest również dostępny dla macOS poprzez brew.
Muhammad Annaqeeb,
5

Problem polega na tym, że edytujesz za pomocą Dos!

otwórz plik za pomocą vi, a następnie ustaw uniks za pomocą:

:set ff=unix
:wq

i wszystko w porządku

DaFreder
źródło
4

Zrobić vi <your script>.

wtedy :set list; wyświetli dowolny ze znaków specjalnych w twoim skrypcie.

następnie zamień znak:

:%s/^M//gc [aby wpisać ^Mnaciśnij Ctrl+ v+ m]

Pankaj Sain
źródło
Zobacz powyższą odpowiedź na temat używania: format pliku, który jest IMHO lepszy do obsługi tego niż globalne zastępowanie. Zobacz także stackoverflow.com/questions/14609779/…, aby dowiedzieć się, jak obsługiwać automatycznie
qneill
4

Jak wyjaśniono w innych odpowiedziach, jest to problem z formatem. Tak więc odpowiedzią jest zmiana formatu z DOS na zakończenia linii w stylu uniksowym. To kolejny prosty sposób, aby naprawić plik „na miejscu”

fromdos file

Jest dostępny w pakiecie tofrodos:

sudo apt-get install tofrodos
josediazaz
źródło
2

Możesz także użyć gedit, aby usunąć niechciane postacie. W menu Plik wybierz Zapisz jako i ustaw typ końca linii unix / Linux.

torfia
źródło
+1 za to, ponieważ pomogło mi to z zakończeniami linii MacOS.
Bobble