'\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

См.: Windows CRLF для Unix LF Проблемы в Vagrant.

Вы также можете добавить опцию -o igncr на вызов bash, например

bash -x -o igncr script.sh

Согласно этой сути, решение состоит в том, чтобы создать ~/.bash_profileHOME каталог), который содержит:

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:

  1. Открыть файл
  2. Mx set-buffer-file-coding-system
  3. Выберите "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 EditorConfig - это мой выбор.


2. Актуальность

Этот ответ актуален для марта 2018 года. В дальнейшем данные из этого ответа могут устареть.

Автор этого ответа лично использовал EditorConfig в марте 2018 года.


3. Ограничения

Вам необходимо использовать один из поддерживаемых IDE/ редакторов.


4. Аргументация

  1. Просто использование. Мне нужно установить мой .editorconfig 1 раз, когда я создаю свой проект, я могу забыть некоторые проблемы, связанные с платформой, стилем и IDE.
  2. Кроссплатформенность, кросс-языки, кросс-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 для этого файла.


6. Дополнительные ссылки

Другие вопросы по тегам