Не вдається виконати .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користувача?

Відповіді:


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 і зробіть "Зберегти як" та виберіть "Закінчення рядка: Unix / Linux"
Метмон

23

In vim ви також можете використати :set ff=unixта зберегти файл або :set ff=dosзнову отримати формат DOS.


цей зробив це для мене, thx
bunkerdive

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 повинен мати можливість правильно інтерпретувати файл.


1
Спасибі, dos2unix також доступний для macOS через пивоваріння.
Мухаммад Аннакіб

5

Проблема, яку ви редагуєте за допомогою Dos!

відкрийте файл з vi, а потім встановіть unix за допомогою:

:set ff=unix
:wq

і все добре


4

Зробіть vi <your script>.

потім :set list; він відображатиме будь-який із спеціальних символів у вашому сценарії.

потім замініть символ:

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


Дивіться вище відповідь про використання: файловий формат, який IMHO кращий для вирішення цього питання, ніж глобальна підміна. Також, див. Stackoverflow.com/questions/14609779/… про ідеї, як автоматично працювати
qneill

4

Як пояснено в інших відповідях, це питання формату. Отже, відповідь - змінити формат з закінчення рядків стилю DOS на Unix. Це ще один простий спосіб виправити файл "на місці"

fromdos file

Доступно в упаковці tofrodos:

sudo apt-get install tofrodos

2

Ви також можете використовувати gedit для видалення небажаних символів. У меню Файл виберіть Зберегти як і встановіть тип кінця рядка unix / Linux.


+1 для цього, тому що він допоміг мені закінчення рядків MacOS.
Боббл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.