Windows CRLF для Unix LF Проблемы в Vagrant
Я работаю над подготовкой нескольких виртуальных машин, используя Vagrant
, Вот ситуация:
Хост: Windows 7 (64-разрядная версия)
Гость: Ubuntu 14.04 (64-разрядная версия)
У меня возникла проблема с переводом концов строк CRLF в LF. Это приводит к сбою скриптов bash в общей папке на гостевой машине (см. Ниже).
vagrant@vagrant-host:/vagrant/bin$ sudo bash build-ubuntu-14.04.1-c
make.sh
build-ubuntu-14.04.1-cmake.sh: line 5: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 19: $'\r': command not found
: invalid option04.1-cmake.sh: line 21: set: -
set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
build-ubuntu-14.04.1-cmake.sh: line 22: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 24: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 26: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 29: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 36: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 42: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 46: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 48: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 50: $'\r': command not found
build-ubuntu-14.04.1-cmake.sh: line 226: syntax error: unexpected end of file
В моем Vagrantfile я установил параметр оболочки Privisioner binary
ложно.
# Provision the VM
ubuntu.vm.provision "shell" do |s|
# replace Windows line endings with Unix line endings
s.binary = false
s.inline = "sudo apt-get update;
sudo bash vagrant/bin/build-ubuntu-14.04.1-cmake.sh"
end
В соответствии с документацией Vagrant:
binary
(булево) - Vagrant автоматически заменяет окончания строк Windows на окончания строк Unix. Если это правда, то Вагрант не будет этого делать. По умолчанию это "ложь". Если поставщик оболочки взаимодействует через WinRM, по умолчанию используется значение "true".
В чем здесь проблема? Я что-то пропускаю в документации?
Обновление 1: я попытался отредактировать свои локальные настройки Git, как рекомендовано в ответе на переполнение стека, но безуспешно. Кроме того, я добавил .gitattributes
файл в корневой каталог проекта и добавил следующее к этому файлу:
# detect all text files and automatically normalize them (convert CRLF to LF)
* text=auto
Я также прочитал документ "Работа с окончаниями строк", предоставленный Git. Когда я фиксирую свой репозиторий, CRLF преобразуются в LF, но когда я извлекаю изменения в рабочем пространстве Windows, LF преобразуются в CRLF. Это именно то поведение, которое я хочу в моем рабочем процессе Git. Проблема с Vagrant. binary
флаг, который я установил, не работает так, как описано в документации.
Обновление 2: изменение s.binary = true
исправил проблему. Тем не менее, я думаю, что формулировка в документации должна быть пересмотрена. В документации говорится, что "если этот [флаг] имеет значение true, то Vagrant не будет этого делать [сменить CRLF на LF]". Как я понимаю, Vagrant не изменит CRLF на LF, если этот флаг установлен. Однако CRLF заменяются на LF, если для этого параметра установлено значение true.
2 ответа
Как было указано выше в моем обновлении, меняется s.binary = true
исправил проблему. Тем не менее, я думаю, что формулировка в документации должна быть пересмотрена. В документации говорится, что "если этот [флаг] имеет значение true, то Vagrant не будет этого делать [сменить CRLF на LF]". Как я понимаю, Vagrant не изменит CRLF на LF, если этот флаг установлен. Однако CRLF заменяются на LF, если для этого параметра установлено значение true.
Вы правы, документация о binary
вводит в заблуждение. Я предложил pull-запрос, и это было исправлено на странице документации.
Итак, сейчас говорится:
binary
(булево) - Vagrant автоматически заменяет окончания строк Windows на окончания строк Unix. Если этоfalse
тогда Вагрант этого не сделает. По умолчанию этоfalse
, Если поставщик оболочки взаимодействует через WinRM, по умолчаниюtrue
,
Так что заменить виндовые окончания строк (CRLF
) с окончаниями строки Unix (LF
) вам нужно установить:
s.binary = true
Альтернативные решения включают в себя:
Изменение конца строки вручную:
- с помощью
dos2unix
команда, с помощью
ex
команда, напримерex +'bufdo! %! tr -d \\r' -scxa *.sh
- с помощью
Добавьте следующие строки в ваш файл Bashrc (например,
~/.bashrc
)export SHELLOPTS set -o igncr
Если вы используете Git для создания версий своего кода, вам следует:
Настройте Git на OS X для правильной обработки концов строк, установив
core.autocrlf
возможностьinput
или жеfalse
,Если вы установили Git On Windows, наиболее распространенной ошибкой является выбор опции Checkout в стиле Windows во время установки, поэтому вам следует переустановить ее и выбрать один из вариантов: Checkout as is is и принятие окончаний строки в стиле Unix (
core.autocrlf
установлен вinput
) или Оформить заказ как есть, зафиксировать как есть (core.autocrlf
установлен вfalse
).Подумайте о создании файла нормализации git в вашем хранилище (
.gitattributes
), который гарантирует отсутствие конца строки CRLF ни при оформлении заказа, ни при регистрации, например:*.sh text eol=lf
Поэтому люди, редактирующие ваш сценарий инициализации, не будут прерывать окончания строки.
Читайте также: Работа с окончаниями строк в GitHub Help.
- Связанный: '\ r': команда не найдена -.bashrc /.bash_profile.
Возможно завершение вышеуказанного:
Сентябрь 2020 г., при использовании Vagrant 2.2.10 на компьютере с Windows 10 поведение по умолчанию, по-видимому, заключается в попытке заменить окончания строк Windows. Однако это означает, что если вы действительно используете окончания строк Linux в своем Vagrantfile - это не сработает!
Я был озадачен получением нескольких немного разных ошибок вроде
"Vagrantfile:1: syntax error, unexpected tIDENTIFIER,
expecting end-of-input [+ reference to different places in the Vagrantfile]"
Путем догадок мне наконец пришла идея изменить окончание строк с Linux LF на Windows CR+LF, и все это заработало.
TL;DR: используя Vagrant в окнах, используйте окончания строк Windows (CR+LF) в ваших Vagrantfiles.