Поиск по сайту:

Исправлено: ошибка «Плохой интерпретатор: нет такого файла или каталога» в Linux


Резюме: Если вы получаете ошибку «плохой интерпретатор: нет такого файла или каталога» при запуске сценария оболочки, вам необходимо преобразовать файл сценария из окончаний строк Windows в Unix. Один из способов — использовать команду dos2unix, например:

dos2unix script1.sh

Вы пытались запустить сценарий Bash и получили сообщение об ошибке «/bin/bash^M: плохой интерпретатор: нет такого файла или каталога»? Вывод не очень полезен и почти создает впечатление, что ваш скрипт отсутствует. К счастью, это не так, и исправить это очень просто.

Что такое ошибка «Плохой интерпретатор: нет такого файла или каталога»?

Получение сообщения об ошибке, которое гласит: /bin/bash^M: плохой интерпретатор: нет такого файла или каталога , просто означает, что ваш файл сценария оболочки имеет неправильные окончания строки — символы, помещенные в конце строки указывая на то, что пришло время перейти к следующей строке. Windows, происходящая от DOS, любит видеть терминатор «возврат каретки и перевод строки» (CRLF), обозначенный \r\n. Напротив, в Linux, современных macOS и других системах на базе Unix используется только «перевод строки» (LF) или \n.

Если вы видите эту ошибку неправильного интерпретатора, скорее всего, либо вы, либо человек, от которого вы получили сценарий, изначально написал его на компьютере с Windows. Bash видит эти окончания строк \r\n, установленные компьютером Windows, и расстраивается, потому что они не позволяют оболочке правильно интерпретировать ваш сценарий.

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

file script1.sh

Если в файле используются окончания строк DOS, вы увидите сообщение «с разделителями строк CRLF», добавленное к выходным данным. Если бы наш сценарий использовал правильные символы новой строки Unix (LF), он бы вообще не упоминал терминаторы. К счастью, вернуться в бизнес LF легко.

Как исправить ошибку «Плохой интерпретатор: нет такого файла или каталога»

Все, что нужно, чтобы избавиться от этого сообщения об ошибке и начать запускать ваши сценарии в обычном режиме, — это переключиться с окончаний строк DOS на окончания строк Unix. Вы можете сделать это с помощью команд терминала или в вашем любимом редакторе кода. Вот восемь способов исправить это:

Использование команды dos2unix

Существует программа командной строки, созданная специально для преобразования файлов DOS (она же Windows) в полностью совместимые с Unix файлы с метким названием dos2unix. Он доступен в большинстве репозиториев по умолчанию, поэтому вы можете установить его в Ubuntu с помощью:

sudo apt install dos2unix

В нашей установке Fedora dos2unix был предустановлен, но вы можете подтвердить, что он у вас есть:

sudo dnf install dos2unix

В Arch Linux:

sudo pacman -S dos2unix

Использовать dos2unix просто; просто дайте ему имя вашего файла.

dos2unix script1.sh

Проверьте это с помощью file, если вы хотите убедиться, что преобразование прошло успешно, прежде чем запускать скрипт. Вы также можете выполнить массовое преобразование, назвав несколько файлов, разделенных только пробелом.

dos2unix script1.sh script2.sh script3.sh

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

dos2unix script*.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) ни с чем. Это оставляет нас с предпочитаемыми в Unix разделителями строк \n.

Использование vi или vim

Если вы используете vi или vim для редактирования своих сценариев, просто передайте эту команду, чтобы преобразовать текущий открытый файл в окончания строк Unix.

:set fileformat=unix

Использование 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».