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 esfalse
, entonces Vagrant no hará esto . Por defecto esto esfalse
. Si el aprovisionador de shell se está comunicando a través de WinRM, este valor predeterminado estrue
.
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 ejemploex +''bufdo! %! tr -d //r'' -scxa *.sh
- usando el comando
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
parainput
ofalse
.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 eninput
) o Checkout as-is, commit as-is (core.autocrlf
se establece enfalse
).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 .