Windows CRLF для Unix LF Проблемы в Vagrant
Я работаю над созданием нескольких виртуальных машин с помощью Vagrant
. Здесь ситуация:
Хост: Windows 7 (64-разрядная версия)
Гость: Ubuntu 14.04 (64-разрядная версия)
У меня возникла проблема с получением окончаний строк CRLF для преобразования в LF. Это приводит к сбою сценариев bash в общей папке в гостевой машине (см. Ниже).
[email protected]:/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 я установил параметр privationaler оболочки binary
в значение false.
# 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
(boolean) - 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
исправило проблему. Однако я считаю, что формулировку в документации следует пересмотреть. В документации указано, что "Если это [флаг] истинно, то Vagrant не будет делать это [изменить CRLF на LF]". Как я понимаю, Vagrant не изменяет CRLF на LF, если этот флаг установлен. Однако CRLF меняются на LF, если для этого установлено значение true.
Ответы
Ответ 1
Как было указано выше в моем обновлении, изменение s.binary = true
устраняет проблему. Однако я считаю, что формулировку в документации следует пересмотреть. В документации указано, что "Если этот [флаг] является истинным, тогда Vagrant не будет этого делать [изменить CRLF на LF]". Как я понимаю, Vagrant будет не изменять CRLFs для LF, если этот флаг установлен. Однако CRLF меняются на LF, если для этого установлено значение true.
Ответ 2
Вы правы, документация о binary
вводит в заблуждение. Я предложил pull-request, и это было исправлено на странице документации.
Итак, теперь он указывает:
binary
(boolean) - Vagrant автоматически заменяет окончание строк Windows с окончанием линии Unix. Если это false
, то бродяга не будет делать это. По умолчанию это false
. Если средство обеспечения оболочки обмениваясь данными по WinRM, по умолчанию используется true
.
Итак, чтобы заменить окончание строк Windows (CRLF
) концами строк Unix (LF
), вам необходимо установить:
s.binary = true
Альтернативные решения включают:
-
Изменение окончаний строк вручную:
-
Добавьте следующие строки в ваш файл Bashrc (например, ~/.bashrc
) gist
export SHELLOPTS
set -o igncr
Если вы используете Git для версии вашего кода, вы должны:
-
Настройте Git на OS X, чтобы правильно обрабатывать окончания строк, установив для параметра core.autocrlf
значение input
или false
.
Если вы установили Git В Windows, наиболее распространенная ошибка заключается в том, чтобы выбрать опцию Checkout Windows-style во время установки, поэтому вы должны переустановить ее и выбрать либо: Checkout as-is и commit Unix-style line endings (core.autocrlf
установлен на input
) или Checkout as-is, commit as-is (core.autocrlf
установлен на false
).
-
Подумайте о создании файла нормализации Git в вашем репозитории (.gitattributes
), который не гарантирует, что строки CRLF не будут место, ни при оформлении заказа, ни при регистрации, например:
*.sh text eol=lf
Таким образом, люди, редактирующие ваше обеспечение script, не будут нарушать окончание строки.
-
Читайте также: Работа с окончаниями строк в справке GitHub.
- Связано: '\ r': команда не найдена -.bashrc/.bash_profile.