the run provisioners provisioned provision machine already vagrant virtual-machine vagrantfile eol

run - Problemas de Windows CRLF a Unix LF en Vagrant



vagrant run (2)

Como se especificó anteriormente en mi actualización, cambiar s.binary = true solucionó el problema. Sin embargo, creo que la redacción de la documentación debería ser redirigida. La documentación indica que "Si esta [la bandera] es verdadera, Vagrant no hará esto [cambiar CRLF a LF]". Como entiendo entonces, Vagrant no cambiará los CRLF a LF si se establece este indicador. Sin embargo, los CRLF se cambian a LF si se establece en verdadero.

Estoy trabajando en el aprovisionamiento de algunas máquinas virtuales utilizando Vagrant . Aquí está la situación:

Anfitrión : Windows 7 (64 bits)

Invitado : Ubuntu 14.04 (64 bits)

Estoy teniendo un problema al hacer que los finales de línea CRLF se conviertan a LF. Esto hace que los scripts de bash en la carpeta compartida fallen dentro de la máquina invitada (ver más abajo).

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

En mi Vagrantfile he establecido el parámetro binary administrador de privilegios de shell en falso.

# 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

Según la documentación de Vagrant:

binary (booleano): Vagrant reemplaza automáticamente los finales de línea de Windows con los finales de línea Unix. Si esto es cierto, entonces Vagrant no hará esto. Por defecto esto es "falso". Si el aprovisionador de shell se está comunicando a través de WinRM, este valor predeterminado es "verdadero".

¿Cuál es el problema aquí? ¿Estoy pasando por alto algo en la documentación?

Actualización 1 : He intentado editar la configuración de mi Git local como se recomienda en esta respuesta de Desbordamiento de pila , pero no tengo suerte. Además, agregué un archivo .gitattributes al directorio raíz del proyecto y agregué lo siguiente a ese archivo:

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

También he leído el documento "Tratar con los finales de línea" proporcionado por Git. Cuando me comprometo a mi repositorio, los CRLF se convierten en LF, pero cuando pago los cambios en un área de trabajo de Windows, los LF se convierten en CRLF. Este es el comportamiento exacto que quiero en mi flujo de trabajo Git. El problema es con Vagrant. El indicador binary que establezco no funciona como describe la documentación.

Actualización 2 : Cambiar s.binary = true solucionó el problema. Sin embargo, creo que la redacción de la documentación debería ser redirigida. La documentación indica que "Si esta [la bandera] es verdadera, Vagrant no hará esto [cambiar CRLF a LF]". Como entiendo entonces, Vagrant no cambiará los CRLF a LF si se establece este indicador. Sin embargo, los CRLF se cambian a LF si se establece en verdadero.


Tienes razón, la documentación sobre binary fue engañosa. He propuesto una solicitud de extracción y esto se ha corregido en la página de documentación.

Así que ahora dice:

binary (booleano): Vagrant reemplaza automáticamente los finales de línea de Windows con los finales de línea Unix. Si esto es false , entonces Vagrant no hará esto . Por defecto esto es false . Si el aprovisionador de shell se está comunicando a través de WinRM, este valor predeterminado es true .

Entonces, para reemplazar los finales de línea de Windows ( CRLF ) con los finales de línea de Unix ( LF ), debe configurar:

s.binary = true

Las soluciones alternativas incluyen:

  • Cambiando los finales de línea manualmente por:

    • usando el comando dos2unix ,
    • usando comando ex , por ejemplo

      ex +''bufdo! %! tr -d //r'' -scxa *.sh

  • Agregue las siguientes líneas en su archivo Bashrc (por ejemplo, ~/.bashrc ):

    export SHELLOPTS set -o igncr

Si está utilizando Git para versionar su código, debe:

  • Configure Git en OS X para manejar adecuadamente los finales de línea configurando la opción core.autocrlf para input o false .

    Si ha instalado Git en Windows, el error más común es seleccionar la opción Checkout Windows-style durante la instalación, por lo que debe volver a instalarlo y elegir: Checkout tal como está y confirmar los finales de línea de estilo Unix ( core.autocrlf se establece en input ) o Checkout as-is, commit as-is ( core.autocrlf se establece en false ).

  • Considere crear un archivo de normalización de git en su repositorio ( .gitattributes ) que garantice que no haya ningún final de línea CRLF, ni en el proceso de pago ni en el registro, por ejemplo:

    *.sh text eol=lf

    Así que la gente que edita su script de aprovisionamiento no romperá los finales de línea.

  • Lea también: Cómo tratar los finales de línea en la Ayuda de GitHub.

  • Relacionado: ''/ r'': comando no encontrado - .bashrc / .bash_profile .