Jon*_*han 17 virtual-machine eol vagrant vagrantfile
我正在使用配置一些虚拟机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
Run Code Online (Sandbox Code Playgroud)
在我的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
Run Code Online (Sandbox Code Playgroud)
根据Vagrant文档:
binary(布尔值) - Vagrant自动用Unix行结尾替换Windows行结尾.如果这是真的,那么Vagrant就不会这样做.默认情况下,这是"假".如果shell配置程序通过WinRM进行通信,则默认为"true".
这是什么问题?我是否忽略了文档中的内容?
更新1:我已尝试按照此Stack Overflow应答中的建议编辑我的本地Git设置,但没有运气.另外,我已将一个.gitattributes文件添加到项目的根目录中,并将以下内容添加到该文件中:
# detect all text files and automatically normalize them (convert CRLF to LF)
* text=auto
Run Code Online (Sandbox Code Playgroud)
我还读过Git提供的"处理行结尾"文档.当我提交到我的存储库时,CRLF会转换为LF,但是当我在Windows工作区中检出更改时,LF会转换为CRLF.这是我在Git工作流程中想要的确切行为.问题在于Vagrant.binary我设置的标志不执行文档描述的方式.
更新2:更改s.binary = true修复了问题.但是,我认为文件中的措辞应该重新解决.文档说明"如果这个[标志]为真,那么Vagrant 将不会这样做[将CRLF更改为LF]." 据我所知,如果设置了此标志,Vagrant将不会将CRLF更改为LF.然而,CRLFs 被改变的LF如果设置为true.
ken*_*orb 12
你是对的,文档binary是误导性的.我已经提出了一个pull-request,这已在文档页面上得到纠正.
现在它说:
binary(布尔值) - Vagrant自动用Unix行结尾替换Windows行结尾.如果是这样false,那么Vagrant就不会这样做.默认情况下这是false.如果shell配置程序通过WinRM进行通信,则默认为true.
因此,CRLF要用Unix行结尾(LF)替换Windows行结尾(),您需要设置:
s.binary = true
Run Code Online (Sandbox Code Playgroud)
替代方案包括:
手动更改行结尾:
dos2unix命令,使用ex命令,例如
ex +'bufdo! %! tr -d \\r' -scxa *.sh
Run Code Online (Sandbox Code Playgroud)将以下行添加到Bashrc文件中(例如~/.bashrc)gist:
export SHELLOPTS
set -o igncr
Run Code Online (Sandbox Code Playgroud)如果您使用Git对代码进行版本控制,则应该:
通过将core.autocrlf选项设置为input或,在OS X上配置Git以正确处理行结尾false.
如果您已安装Git On Windows,最常见的错误是在安装期间选择Checkout Windows样式选项,因此您应该重新安装它并选择:Checkout as-is并提交Unix样式的行结尾(core.autocrlf设置为input)或按原样结帐,按原样提交(core.autocrlf设置为false).
考虑在您的repository(.gitattributes)中创建git规范化文件,以确保没有CRLF行结束,无论是在结账时还是在checkin上,例如:
*.sh text eol=lf
Run Code Online (Sandbox Code Playgroud)
所以人们编辑你的配置脚本,他们不会打破行结尾.
另请阅读:在GitHub帮助中处理行结尾.
正如我在更新中所述,更改s.binary = true修复了问题.但是,我认为文件中的措辞应该重新解决.文档说明"如果这个[标志]为真,那么Vagrant将不会这样做[将CRLF更改为LF]." 据我所知,如果设置了此标志,Vagrant将不会将 CRLF 更改为LF.然而,CRLFs 被改变的LF如果设置为true.
| 归档时间: |
|
| 查看次数: |
6863 次 |
| 最近记录: |