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

107

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

-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
источник

Ответы:

182

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

/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
жилль
источник
22
Или установите и используйте dos2unixпрограмму.
argentpepper
4
спасибо за это, все остальные ответы, которые я нашел до сих пор, не помогли. Этот сделал это!
qodeninja
не обязательно должен быть Windows, я получил похожее сообщение после копирования скрипта из OS X в Ubuntu ... dos2unix отлично работал в этом случае, тогда как замена '\ r' ничем не была бы хуже, так как нет '\ n 'символов в файле.
Майкл
1
@Michael macOS использует, \nпотому что это Unix. Сценарий может быть из более ранней версии Mac OS? Вы могли бы бежать sed -i -e 's/\r$/\n/' script.shв этом случае.
wjandrea
1
Откройте его в gedit и, сделайте Save As, и выберите «Конец строки: Unix / Linux»
Mattmon
23

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

ortang
источник
этот сделал это для меня,
спасибо
19

Ваш файл имеет окончания строки в стиле 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
источник
1
Спасибо, dos2unix также доступен для macOS через brew.
Мухаммед Аннакиб
5

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

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

:set ff=unix
:wq

и все нормально

DaFreder
источник
4

Есть vi <your script>.

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

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

:%s/^M//gc [набрать ^Mнажмите Ctrl+ v+ m]

Панкай Саин
источник
См. Выше ответ об использовании: fileformat, который ИМХО лучше для обработки, чем глобальная подстановка. Также см. Stackoverflow.com/questions/14609779/… для идей о том, как обрабатывать автоматически
qneill
4

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

fromdos file

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

sudo apt-get install tofrodos
josediazaz
источник
2

Вы также можете использовать Gedit для удаления нежелательных символов. В меню File выберите Save As и установите тип конца строки unix / Linux.

tphistry
источник
+1 за это, потому что это помогло мне с окончаниями строк MacOS.
Боббл