Исправлено: ошибка «Плохой интерпретатор: нет такого файла или каталога» в Linux
Опубликовано: 2023-05-01dos2unix
, например: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 аппаратными