'\r': команда не найдена - .bashrc / .bash_profile
У меня есть окна, используя Cygwin, пытаясь установить JAVA_HOME
навсегда через мой .bashrc
файл.
.bashrc:
export PATH="$JAVA_HOME/bin:$PATH"
export JAVA_HOME=$JAVA_HOME:"/cygdrive/c/Program Files (x86)/Java/jdk1.7.0_05"
.bash_profile:
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fi
работает Cygwin:
-bash: $'\377\376if': command not found
-bash: $'then\r': command not found
: No such file or directorysu//.bashrc
-bash: /cygdrive/c/Users/jhsu//.bash_profile: line 3: syntax error near unexpected token `fi'
-bash: /cygdrive/c/Users/jhsu//.bash_profile: line 3: `fi'
Я не уверен, взял ли я команды из учебника, предназначенного для другой системы, или пропустил шаг. Или пробел заставляет мои команды не работать должным образом.
Я посмотрел на несколько похожих вопросов, но не нашел такого, в котором вопрос содержит мою ошибку.
Мой домашний путь:
$ echo $HOME
/cygdrive/c/Users/jhsu
$ echo ~
/cygdrive/c/Users/jhsu/
Поэтому я считаю, что файлы должны быть размещены в правильном месте.
19 ответов
Когда все остальное терпит неудачу в Cygwin...
Попробуйте запустить dos2unix
команда для рассматриваемого файла.
Это может помочь, когда вы видите такие сообщения об ошибках:
-bash: '\r': command not found
Символы новой строки в стиле Windows могут вызвать проблемы в Cygwin.
dos2unix
Команда изменяет символы новой строки, чтобы они были совместимы с Unix / Cygwin.
ВНИМАНИЕ: команда dos2unix изменяет файлы на месте, поэтому при необходимости примите меры предосторожности.
Если вам нужно сохранить оригинальный файл, сначала сделайте его резервную копию.
Примечание для пользователей Mac: dos2unix
команда не существует в Mac OS X.
Проверьте этот ответ для различных решений с использованием различных инструментов.
Также есть unix2dos
команда, которая делает обратное:
Он изменяет символы новой строки Unix, чтобы они были совместимы с инструментами Windows.
Если вы открываете файл с помощью Блокнота и все строки запускаются вместе, попробуйте unix2dos filename
,
Для тех, кто не установил dos2unix (и не хочет устанавливать его):
Удалить трейлинг \r
символ, который вызывает эту ошибку:
sed -i 's/\r$//' filename
Пояснение:
вариант -i
для редактирования на месте, мы удаляем трейлинг \r
прямо во входном файле. Таким образом, будьте осторожны, чтобы набрать шаблон правильно.
Для пользователей WINDOWS с Notepad ++ (проверено с v6.8.3) вы можете исправить определенный файл, используя опцию - Правка -> Преобразование EOL -> Формат Unix/OSX
И сохраните ваш файл снова.
Изменить: все еще работает в v7.5.1 (29 августа 2017 г.)
Я использую Cygwin и Windows7, хитрость была не в том, чтобы поставить set -o igncr
в ваш.bashrc, но положить весь SHELLOPTS
в вас переменные среды под Windows. (Так что ничего с Unix / Cygwin...) Я думаю, что это не работает с .bashrc
потому что "капли уже высосаны", как мы сказали бы по-немецки.;-) Так что мой SHELLOPTS
выглядит так
braceexpand:emacs:hashall:histexpand:history:igncr:interactive-comments:monitor
ОБЫЧНЫЙ ТЕКСТ
С возвышенным вы просто идете
Вид - > Концы строк -> (выбрать)Unix
Затем сохраните файл. Исправлю эту проблему.
Так просто!
Попробуйте выполнить следующую команду
vim .bashrc
:set ff=unix
:wq!
Если вы используете последний Cygwin (например, 1.7), вы также можете запустить оба .bashrc
а также .bash_profile
со следующей строкой в первой строке без комментариев:
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
(set -o igncr) 2>/dev/null && set -o igncr; # this comment is needed
Это заставит bash игнорировать возврат каретки (\r
) символы, используемые в разделителях строк Windows.
См. http://cygwin.com/ml/cygwin-announce/2010-08/msg00015.html.
Ошибка:
'\r'
: команда не найдена
вызвано тем, что оболочка не может распознать Windows-подобные окончания строк CRLF (0d 0a
) как он ожидает только LF
(0a
).
Гит
Если вы используете Git в Windows, убедитесь, что вы выбрали " Оформить заказ как есть " во время установки. Затем убедитесь, что вы запустили: git config --global core.autocrlf false
, поэтому Git не будет выполнять какие-либо преобразования при проверке или фиксации текстовых файлов.
dos2unix
Если вы не используете Git, вам просто нужно преобразовать эти уязвимые файлы / сценарии обратно в Unix-подобные окончания строк (LF), либо:
dos2unix ~/.bashrc
Обратите внимание dos2unix
команда является частью dos2unix
пакет.
Ex / Vim редактор + tr
Если вы установили Vim, следующая команда должна исправить файлы:
ex +'bufdo! %! tr -d \\r' -scxa ~/.bash*
Полезный псевдоним: alias dos2unix="ex +'bufdo! %! tr -d \\\\r' -scxa"
,
tr
Вот метод с использованием tr
:
cat ~/.bashrc | tr -d '\r' > ~/.bashrc.fixed && mv -v ~/.bashrc.fixed ~/.bashrc
или же:
tr -d '\r' < filename > new_filename
Обратите внимание \r
эквивалентно \015
,
sed
Вы можете попробовать следующую команду:
sed -i'.bak' s/\r//g ~/.bash*
recode
Следующие псевдонимы могут быть полезны (который заменяет dos2unix
команды):
alias unix2dos='recode lat1:ibmpc'
alias dos2unix='recode ibmpc:lat1'
Источник: Бесплатные инструменты Unix (ssh, bash и т. Д.) Под Windows.
perl
Следующие perl
Команда может конвертировать файл из DOS в формат Unix:
perl -p -i.bak -e 's/\015//g' ~/.bash*
Источник: зачистка ^ M.
tofrodos
В Linux, как Ubuntu, который не входит в стандартную комплектацию dos2unix
или же unix2dos
Вы можете установить tofrodos
пакет (sudo apt-get install tofrodos
) и определите следующие псевдонимы:
alias dos2unix=’fromdos’
alias unix2dos=’todos’
Затем используйте тот же синтаксис, что и выше.
бродяга
Если вы используете Vagrant VM, и это происходит для сценария инициализации, попробуйте установить binary
возможность true
:
# Shell provisioner, see: https://www.vagrantup.com/docs/provisioning/shell.html
config.vm.provision "shell" do |s|
s.binary = true # Replace Windows line endings with Unix line endings.
s.path = "script.sh"
end
Вы также можете добавить опцию -o igncr
на вызов bash, например
bash -x -o igncr script.sh
Согласно этой сути, решение состоит в том, чтобы создать ~/.bash_profile
(в HOME
каталог), который содержит:
export SHELLOPTS
set -o igncr
Может быть, вы использовали notepad++ для создания / обновления этого файла.
EOL (Edit-> EOL Conversion) Преобразование по умолчанию - Windows.
Изменение преобразования EOL в Notepad++
Edit -> EOL Conversion -> Unix (LF)
Решено с помощью Notepad ++:
1) Меню-> Правка-> Преобразование EOL -> Формат Unix/OSX
2) Затем сохраните
Исправлена
Люди, которые используют notepad++(6.8.1) для доставки сценариев оболочки из windows в linux.
установите следующее в блокноте ++ Edit -> EOL Conversion -> Unix/OSX format
Для пользователей Emacs:
- Открыть файл
- Mx set-buffer-file-coding-system
- Выберите "Unix"
Это обновит новые символы в файле в стиле Unix. Более подробную информацию о "представлении новой строки" в Emacs можно найти здесь:
http://ergoemacs.org/emacs/emacs_line_ending_char.html
Примечание. Приведенные выше шаги могут быть выполнены в сценарии Emacs, если вы предпочитаете выполнять это из командной строки.
У меня такая же проблема. Решение: я редактирую файл с помощью редактора pspad и даю ему формат unix (Меню - Формат -> UNIX)
Я считаю, что вы можете установить этот формат для вашего файла со многими другими редакторами
Возможно, проблема возникла из-за файла / скрипта, созданного / загруженного с компьютера Windows. Пожалуйста, попробуйте конвертировать в формат файла Linux.
dos2unix ./script_name.sh
или же
dos2unix ~/.bashrc
Если у вас установлен пакет vim в вашей установке Cygwin, вы можете использовать vim, чтобы исправить это без поиска и замены. Запустите vim следующим образом: vim filename.sh
(часто это также псевдоним vi). Затем введите :set fileformat=unix
, затем :wq
(написать и выйти), чтобы сохранить изменения. (The :
переводит вас в режим редактирования vim.)
Я рекомендую это по сравнению с dos2unix, поскольку vim, вероятно, чаще устанавливается.
Однако, вероятно, рекомендуется настроить текстовый редактор для сохранения файлов, которые вы планируете использовать в среде Unix/Linux, чтобы иметь текстовый формат Unix. Ответы, приведенные выше для Notepad++, являются хорошим примером.
Дополнительное примечание: если вы не уверены, какой тип файла (DOS или Unix), вы можете использовать file filename.sh
, Это может особенно помочь в отладке более неясных проблем (таких как проблемы с кодированием при импорте дампов SQL, поступающих из Windows).
Другие варианты изменения форматирования текстовых файлов см. В этой статье базы знаний IU.
Дополнительная справочная информация о скриптах Bash и окончаниях строк содержится в этом вопросе Stackru.
В EditPlus вы делаете это из Document → File Format (CR/LF) → Change File Format...
меню, а затем выберите Unix / Mac OS X
переключатель.
1. Выбор
EditorConfig - это мой выбор.
2. Актуальность
Этот ответ актуален для марта 2018 года. В дальнейшем данные из этого ответа могут устареть.
Автор этого ответа лично использовал EditorConfig в марте 2018 года.
3. Ограничения
Вам необходимо использовать один из поддерживаемых IDE/ редакторов.
4. Аргументация
- Просто использование. Мне нужно установить мой
.editorconfig
1 раз, когда я создаю свой проект, я могу забыть некоторые проблемы, связанные с платформой, стилем и IDE. - Кроссплатформенность, кросс-языки, кросс-IDE, кросс-редакторы.
5. Пример
5.1. просто
Я устанавливаю плагин EditorConfig для Sublime Text → мой текстовый редактор. Я редактирую файлы в Sublime Text.
Например, у меня есть sashacrlf.sh
файл:
echo "Sasha" &
echo "Goddess!" &
Я запускаю этот файл в Cygwin:
$ bash sashacrlf.sh
Sasha
sashacrlf.sh: line 1: $'\r': command not found
Goddess!
Я создаю файл .editorconfig
в том же проекте, что и sashacrlf.sh
,
[*.sh]
end_of_line = lf
Это означает, что если вы сохраните любой файл с .sh
В вашем проекте в вашем редакторе EditorConfig устанавливает окончания строк UNIX для этого файла.
я сохраняю sashacrlf.sh
снова в моем текстовом редакторе. я бегу sashacrlf.sh
снова:
$ bash sashacrlf.sh
Sasha
Goddess!
Я не могу получить неожиданный вывод в консоли.
5.2. Несколько расширений файлов
Например, я хочу иметь окончания строк UNIX во всех файлах с расширениями .sh
, .bashrc
а также .bash_profile
, Я добавляю эти строки в мой .editorconfig
файл:
[*.{sh,bashrc,bash_profile}]
end_of_line = lf
Теперь, если я сохраню любой файл с .sh
, .bashrc
или же .bash_profile
расширение, EditorConfig автоматически устанавливает конец строки UNIX для этого файла.