Не удалось выполнить файл .sh: / bin / bash ^ M: плохой интерпретатор

59

Я хотел выполнить сценарий оболочки:

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

Я попытался выполнить стандартную процедуру, но получил эту ошибку:

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

Что это значит? Я делал это как root пользователя в группе root .

Означает ли это, что у файла нет правильного разрешения для пользователя root ?

    
задан user165062 06.06.2013 в 22:17
источник

7 ответов

105

Это не проблема разрешения, вы не получаете сообщения о разрешениях

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

Сценарий указывает, что он должен быть выполнен оболочкой, расположенной в /bin/bash^M . Нет такого файла: он называется /bin/bash .

^M является символом символа возврата каретки . Linux использует символ символ линии , чтобы отметить конец строки, тогда как Windows использует двухсимвольную последовательность CR LF. В вашем файле есть окончания строк Windows, что запутывает Linux.

Удалите ложные символы CR. Вы можете сделать это с помощью следующей команды:

sed -i -e 's/\r$//' create_mgw_3shelf_6xIPNI1P.sh
    
ответ дан Gilles 06.06.2013 в 22:25
12

В vim вы также можете использовать :set ff=unix , а затем сохранить файл, или :set ff=dos , чтобы снова получить форматирование DOS.

    
ответ дан ortang 07.06.2013 в 10:33
5

У вашего файла есть конец строки в стиле DOS / Windows (CR LF) , но в Unix-подобных системах в качестве разрыва строки используется только управляющий символ LF .

Дополнительный символ CR отображается в коде как ^M . Вы также можете увидеть его при запуске cat -A create_mgw_3shelf_6xIPNI1P.sh .

Чтобы преобразовать окончания строк из стиля DOS / Windows в стиль Unix, есть инструмент под названием dos2unix . Вы устанавливаете его, используя:

sudo apt-get install dos2unix

Затем вы можете просто конвертировать окончание строк файлов в обоих направлениях, используя

dos2unix FILENAME
unix2dos FILENAME

В вашем случае просто запустите эту команду ниже, и файл сценария будет преобразован на место:

dos2unix create_mgw_3shelf_6xIPNI1P.sh

После этого Bash должен правильно интерпретировать файл.

    
ответ дан Byte Commander 15.12.2016 в 21:31
4

Как объясняется в других ответах, это вопрос формата. Итак, ответ заключается в изменении формата от DOS до окончаний строки стиля Unix. Это еще один простой способ исправить ваш файл «на месте»

fromdos file

Он доступен в пакете tofrodos :

sudo apt-get install tofrodos
    
ответ дан josediazaz 08.06.2013 в 00:50
2

Сделайте vi <your script> .

, тогда :set list ; он отобразит любой из специальных символов в вашем скрипте.

затем замените символ:

:%s/^M//gc [для ввода ^M нажмите Ctrl + v + m ]

    
ответ дан Pankaj Sain 07.06.2013 в 09:41
2

Вы также можете использовать gedit для удаления нежелательных символов. В меню «Файл» выберите «Сохранить как» и установите тип конца строки unix / Linux.

    
ответ дан tphistry 03.12.2013 в 03:40
2

Проблема заключается в том, что вы редактируете с помощью Dos!

откройте файл с помощью vi затем установите unix с помощью:

:set ff=unix
:wq

и все это прекрасно

    
ответ дан DaFreder 28.04.2016 в 18:29