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

Опубликовано: 2023-05-01
Человек, печатающий на мини-клавиатуре Cherry KW 9200
Ханна Страйкер / How-To Geek
Если вы получаете ошибку «плохой интерпретатор: нет такого файла или каталога» при запуске сценария оболочки, вам необходимо преобразовать файл сценария из окончаний строк Windows в Unix. Один из способов — использовать команду 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.

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

 файл script1.sh 

Проверьте окончания строки файла с помощью команды file в Linux.

Если в файле используются окончания строк 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 

Введите команду dos2unix.

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

 dos2unix script1.sh script2.sh script3.sh

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

 сценарий dos2unix*.sh 

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

Команда 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 

Измените формат файла сценария с помощью команды vim.

СВЯЗАННЫЕ С: Как выйти из редактора Vi или Vim

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

Если вы работаете в среде рабочего стола, нет причин возиться с терминалом только для того, чтобы подготовить файлы для мира Unix. Практически в каждом редакторе кода и IDE есть переключатель окончания строки. В том числе Джини.

Чтобы преобразовать окончания строк в Geany, выберите «Документ» > «Установить окончания строк» ​​> «Преобразовать и установить в LF (Unix)».

В Geany в меню «Документ» перейдите к «Установить окончания строк» ​​и выберите «Преобразовать и установить в LF (Unix)».

Сохраните скрипт и попробуйте запустить его снова.

Использование Кейт или Kwrite

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

В Kwrite в меню «Инструменты» откройте «Конец строки» и выберите «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».

В настройках VS Code измените параметр EOL по умолчанию на «\n».

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