Исправлено: ошибка «Плохой интерпретатор: нет такого файла или каталога» в Linux
Опубликовано: 2023-05-01
dos2unix , например:dos2unix script1.sh
Вы пытались запустить сценарий Bash и получили сообщение об ошибке «/bin/bash^M: плохой интерпретатор: нет такого файла или каталога»? Вывод не очень полезен и почти создает впечатление, что ваш скрипт отсутствует. К счастью, это не так, и исправить это очень просто.
Что такое ошибка «Плохой интерпретатор: нет такого файла или каталога»?
Как исправить ошибку «Плохой интерпретатор: нет такого файла или каталога»
Использование команды dos2unix
Использование команды тр
Использование команды sed
Использование vi или vim
Использование Geany
Использование Кейт или Kwrite
Использование Блокнота++
Использование VS-кода
Что такое ошибка «Плохой интерпретатор: нет такого файла или каталога»?
Получение сообщения об ошибке, которое гласит /bin/bash^M: bad interpreter: No such file or directory просто означает, что ваш файл сценария оболочки имеет неправильные окончания строки — символы, помещенные в конце строки, указывают, что пришло время перейти к следующая строка. Windows, происходящая из DOS, любит видеть терминатор «возврат каретки и перевод строки» (CRLF), обозначенный как \r\n . Напротив, Linux, современная macOS и другие системы на основе Unix используют только «перевод строки» (LF) или \n .
Если вы видите эту ошибку неправильного интерпретатора, скорее всего, либо вы, либо человек, от которого вы получили сценарий, изначально написал его на компьютере с Windows. Bash видит эти окончания строки \r\n установленные компьютером Windows, и расстраивается, потому что они не позволяют оболочке правильно интерпретировать ваш сценарий.

Вы даже можете подтвердить проблему в терминале Linux, указав команду file на свой скрипт.
файл script1.sh

Если в файле используются окончания строк DOS, вы увидите сообщение «с разделителями строк CRLF», добавленное к выходным данным. Если бы наш сценарий использовал правильные символы новой строки Unix (LF), он бы вообще не упоминал терминаторы. К счастью, вернуться в бизнес LF легко.
Как исправить ошибку «Плохой интерпретатор: нет такого файла или каталога»
Все, что нужно, чтобы избавиться от этого сообщения об ошибке и начать выполнять ваши сценарии в обычном режиме, — это переключиться с окончаний строк DOS на окончания строк Unix. Вы можете сделать это с помощью команд терминала или в вашем любимом редакторе кода. Вот восемь способов исправить это:
Использование команды dos2unix
Существует программа командной строки, созданная специально для преобразования файлов DOS (она же Windows) в полностью совместимые с Unix файлы с метким названием dos2unix . Он доступен в большинстве репозиториев по умолчанию, поэтому вы можете установить его в Ubuntu с помощью:
sudo apt установить dos2unix
В нашей установке Fedora dos2unix был предустановлен, но вы можете подтвердить, что он у вас есть:
sudo dnf установить dos2unix
В Arch Linux:
sudo pacman -S dos2unix
Использовать dos2unix просто; просто дайте ему имя вашего файла.
dos2unix script1.sh

Проверьте его с file , если вы хотите убедиться, что преобразование было успешным, прежде чем запускать скрипт. Вы также можете выполнить массовое преобразование, назвав несколько файлов, разделенных только пробелом.
dos2unix script1.sh script2.sh script3.sh
Или, если у вас есть согласованные имена файлов, вы, конечно, можете написать более короткие команды, используя подстановочные знаки.
сценарий dos2unix*.sh


Команда dos2unix имеет несколько флагов, помогающих выполнять особые виды преобразований, например изменение владельца файла. Вы даже можете использовать его в обратной форме, unix2dos , если хотите вернуться к CRLF. Введите dos2unix --help , чтобы узнать больше.
Использование команды тр
Если вы не можете или не хотите устанавливать специальную утилиту, в Linux есть встроенные инструменты, которые очистят эти новые строки. С помощью команды tr вы можете удалить часть \r из концов строки, чтобы у нас остались \n разделители.
tr -d '\r' < script1.sh > script1_unix.sh
Здесь tr берет текст файла script1.sh , удаляет каждый экземпляр \r , который он находит, и сохраняет результат как файл script1_unix.sh .
Использование команды sed
Мощная команда sed , встроенная в вашу оболочку, также может изменять окончания строк в вашем файле.
sed -i 's/\r//' script1.sh
Если вы не знакомы с синтаксисом sed , мы говорим sed отредактировать наш файл ( -i ) и заменить ( s/ ) каждый возврат каретки ( \r ) ничем. Это оставляет нас с предпочтительными символами конца строки \n в Unix.
Использование vi или vim
Если вы используете vi или vim для редактирования своих сценариев, просто передайте эту команду, чтобы преобразовать текущий открытый файл в окончания строк Unix.
: установить формат файла = unix

СВЯЗАННЫЕ С: Как выйти из редактора Vi или Vim
Использование Geany
Если вы работаете в среде рабочего стола, нет причин возиться с терминалом только для того, чтобы подготовить файлы для мира Unix. Практически в каждом редакторе кода и IDE есть переключатель окончания строки. В том числе Джини.
Чтобы преобразовать окончания строк в Geany, выберите «Документ» > «Установить окончания строк» > «Преобразовать и установить в LF (Unix)».

Сохраните скрипт и попробуйте запустить его снова.
Использование Кейт или Kwrite
Если вы используете Kwrite для редактирования сценария или его более мощного двоюродного брата Kate, вы можете преобразовать его в формат LF, щелкнув «Инструменты» > «Конец строки» > «Unix».

Сохраните файл и снова запустите скрипт.
Использование Блокнота++
Если вы редактируете код в Notepad++, вы также можете легко преобразовать окончания строк, что удобно, потому что вы, вероятно, используете его в Windows (если вы не установили Notepad++ для Linux) и можете преобразовать их перед переходом на вашу систему Linux. Открыв файл, выберите «Правка» > «Преобразование EOL» > «Unix (LF)».

Обязательно сохраните скрипт перед его запуском.
Если вы хотите, чтобы Notepad ++ по умолчанию создавал файлы с окончаниями строк Unix, перейдите в «Настройки»> «Настройки», выберите вкладку «Новый документ» и в разделе «Формат (окончание строки)» установите переключатель «Unix (LF)».

Использование VS-кода
Visual Studio Code (VS Code) работает почти так же, только переключатель найти еще проще. Просто нажмите «CRLF» в правом нижнем углу окна VS Code.

Вы также можете настроить VS Code на использование окончаний строк Unix по умолчанию, выбрав «Файл» > «Настройки» > «Настройки» и введя eol в строке поиска настроек. Верхним результатом должно быть выпадающее меню для настройки «Eol». Измените его на «\n».

СВЯЗАННЫЕ С: Как сделать ваши сценарии Bash аппаратными
