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

Я работаю над подготовкой нескольких виртуальных машин с помощью Vagrant. Вот ситуация:

Хоста ОС: Windows 7 (64-разрядная версия)

гость: в Ubuntu 14.04 (64-разрядная версия)

у меня проблема с получением окончаний строк CRLF для преобразования в LFs. Это приводит к сбою сценариев 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 я установил параметр Shell privisioner 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

согласно документации бродяги:

binary (boolean) - Vagrant автоматически заменяет окончания строк Windows окончаниями строк Unix. Если это правда, то бродяга этого не сделает. По умолчанию это "false". Если поставщик оболочки взаимодействует через WinRM, по умолчанию используется значение "true".

в чем здесь проблема? Я что-то упускаю из виду? документация?


обновление 1: Я попытался изменить мои локальные настройки Git, как рекомендовано в этот ответ переполнения стека, но не повезло. Кроме того, я добавил .gitattributes файл в корневой каталог проекта и добавил в этот файл следующее:

# detect all text files and automatically normalize them (convert CRLF to LF)
*       text=auto

Я также прочитал"работа с окончаниями строк" документ, предоставленный Git. Когда я фиксирую в репозитории CRLFs преобразуются в LFs, но когда я изменения проверки в рабочей области Windows LFs преобразуются в CRLFs. Это точное поведение, которое я хочу в моем рабочем процессе Git. Проблема в бродяге. The binary флаг, который я установил, не выполняет способ, описанный в документации.


обновление 2: Меняется s.binary = true Исправлена проблема. Однако я считаю, что формулировки в документации следует пересмотреть. В документации говорится, что " если это [флаг] верно, то Vagrant не будет сделайте это [измените CRLF на LF].- Как я понимаю, Бродяга Уилл!--48-->не измените CRLFs на LFs, если этот флаг установлен. Однако, CRLFs are изменено на LFs, если установлено значение true.

2 ответов


ты прав,документация о binary вводит в заблуждение. Я сделал предложение!--25-->a pull-request и это было исправлено на странице документации.

Итак, он гласит:

binary (boolean) - Vagrant автоматически заменяет окончания строк Windows с концами строк в стиле Unix. если это false, тогда бродяга не пойдет это. По умолчанию это false. Если поставщица оболочка общаясь через WinRM, это по умолчанию true.

Итак, чтобы заменить окончания строки Windows (CRLF) с окончаниями строк Unix (LF) нужно установить:

s.binary = true

альтернативные решения включают в себя:

  • изменение окончаний строк вручную:

    • используя ,
    • используя , например,

      ex +'bufdo! %! tr -d \r' -scxa *.sh
      
  • добавьте следующие строки в свой bashrc и (например,~/.bashrc)суть:

    export SHELLOPTS
    set -o igncr
    

если вы используете Git для управления версиями кода, Вы должны:

  • настройте Git на OS X для правильной обработки окончаний строк, установив до input или false.

    если вы установили Git на Windows, наиболее распространенной ошибкой является выбор оформить заказ в стиле Windows опция во время установки, поэтому вы должны переустановить ее и выбрать либо: Checkout as-is и зафиксировать окончания строки в стиле Unix (core.autocrlf установлено значение input) или оформить заказ как есть, совершить как есть (core.autocrlf установлено значение false).

  • подумайте о создании файла нормализации git в вашем репозитории (.gitattributes), которая обеспечивает отсутствие линии-кода crlf окончаний в место, ни на кассе, ни на чекине, например:

    *.sh     text eol=lf
    

    таким образом, люди, редактирующие ваш сценарий подготовки, они не нарушат окончания строк.

  • Читайте также: работа с окончаниями строк в справке GitHub.

  • по теме: '\r': команда не найдена - .bashrc и / .файл.

Как было указано выше в моем обновление, изменение s.binary = true Исправлена проблема. Однако я считаю, что формулировки в документации следует пересмотреть. В документации говорится ,что " если это [флаг] истинно, то Vagrant не будет этого делать [изменить CRLF на LF].- Как я понимаю, Бродяга Уилл!--2-->не менять CRLFs в LFs, если этот флаг установлен. Однако, CRLFs are изменено на LFs, если установлено значение true.