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

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

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

    • с помощью команды dos2unix,
    • с помощью команды ex, например

      ex +'bufdo! %! tr -d \\r' -scxa *.sh
      
  • Добавьте следующие строки в ваш файл 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.