Ошибка скрипта /bin/sh^M: bad interpreter: No such file or directory

bin/sh^M: bad interpreter

Обычно сообщение bad interpreter о «Плохом интерпретаторе» возникает после внесения изменений в скрипт на виндовой машине и загрузке этого скрипта на Linux. Сообщение может быть следующего вида:

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

Или на русский манер, если система локализована по великую и необъятную:

/bin/sh^M: плохой интерпретатор: Нет такого файла или каталога

Суть проблемы в том, что под на платформе Windows редакторы добавляют символ «возврата каретки» CR/LF. Не все редакторы под Linux виндовый перенос строки умеют отображать, но он там есть, о чем свидетельствует сообщение об ошибке. В итоге в скрипте мы получаем, например первуют строку вместо:

#!/bin/sh

Нечто подобное:

#!/bin/shVM

А ввиду того, что большинство редакторов в Linux эти символы не отображают, о чем я сказал выше, то и диагностировать проблему не легко. Но не стоит отчаиваться! 🙂

Проблема может быть решена двумя способами.

Все приведенные способы работают из консоли (командной строки) Linux/Unix.

Примечание адресовано тем, кто не может понять из синтаксиса записи, что это командная строка.

Способ первый: команда dos2unix

Если вы работаете под Linux Debian или Linux Ubuntu, то команда должна быть в системе. Если ее нет, то устанавливаем ее:

# apt-get install dos2unix

После чего можно приступить к перекодированию:

# dos2unix your-script.sh

По завершении перекодирования все должно нормально работать.

Способ второй: на случай, если нет dos2unix или для труадминов

Удаляем возврат каретки с использованием tr:

# cat your-script.sh | tr -d '\r' > corrected-your-script.sh

Ненавистный Линуксу символ должен быть удален. 😉

 

5 комментария(ев) для “Ошибка скрипта /bin/sh^M: bad interpreter: No such file or directory

  1. Напишите пожалуйста популярно про Удаление возврата каретки с использованием tr:
    # cat your-script.sh | tr -d ‘\r’ > corrected-your-script.sh
    Ввиду того, что я как и многие не программёр, а программёры и так знают и им твоя помощь не так особо нужна, а некоторым даж очень нужна.
    Я выставил на исполнение в cronlab скрипт и по выполнению выдает /bin/sh: /public_html/sitemap/index.php: No such file or directory
    Вопрос Где и как запустить данную строку # cat your-script.sh | tr -d ‘\r’ > corrected-your-script.sh
    Спасибо

    1. Способ и для программеров не слишком очевиден. Команды приведенные в статье выполняются из консоли Linux/Unix. Если у тебя есть ssh доступ к серверу, то проблему сможешь решить в соответствии с приведенным описанием.

      Нужно заметить, что судя по описанию ошибки, твоя проблема не связана с темой данной статьи вообще никаким боком. У тебя ошибка синтаксиса. Проблема в том, что нужно в crontab задать:

      php /public_html/sitemap/index.php

      Если переменные окружения на сервере не прописаны, то:

      /sbin/php /public_html/sitemap/index.php
      или
      /usr/sbin/php /public_html/sitemap/index.php
      или
      /usr/local/bin/php /public_html/sitemap/index.php
      или
      /usr/local/sbin/php /public_html/sitemap/index.php

      Путь зависит от ОС на сервере и того, как установлен php. Если не указана ссылка на интерпретатор, то нужно указывать не php, а php5 или php4 (зависит от версии php).

  2. #!/sh/bin

    В файле поменял на $!sh/bin
    И всё заработало
    Зависит ещё от прав доступа…

    1. #!/bin/sh — это условное указание компилятору какой шелл используется.

      То, что ты написал — неверно. Проблема 100% у тебя была с правами.

      А работает потому что sh у тебя — шелл по-умолчанию. Будет шелл, по-умолчанию другой и не все команды отработают или вообще работать не будет.

Комментарии запрещены.