Bash - 使用CRLF行结尾无缝运行脚本

tre*_*ebi 12 windows bash newline docker

我正在使用VM(在我的情况下只是boot2docker)在Windows主机上运行docker容器.为了方便起见,我的源文件是从主机文件系统映射的,因此默认情况下使用Windows样式的CRLF行结尾而不是Unix样式的LF结尾文本文件.

当我尝试从docker容器运行一些.sh文件时,我会收到错误

bash: ./script.sh: /bin/bash^M: bad interpreter: No such file or directory
Run Code Online (Sandbox Code Playgroud)

有什么方法我怎么能以某种方式告诉bash/sh解释器自动将\ r \n转换为\n并运行文件?

当然,我可以像这样做一些piplelining cat script.sh | tr -d "\r" | sh,甚至为此创建一个别名,但它不会涵盖一个脚本包含另一个脚本的情况.

我到目前为止找到的唯一可接受的解决方案是将Git设置为以UNIX格式签出源文件.

Chr*_*oph 6

您可以在根文件夹中的repo中提交.gitattributes文件,以便在签出时自动告诉Git将LF行结尾应用于所有.sh文件,即使在Windows上也是如此.这样您或其他开发人员就不必记住在克隆repo的每台计算机上配置Git.

# Set line endings to LF, even on Windows. Otherwise, execution within Docker fails.
# See https://help.github.com/articles/dealing-with-line-endings/
*.sh text eol=lf
Run Code Online (Sandbox Code Playgroud)


Von*_*onC 1

我最好的解决方案是确保使用能够以正确的 eol 样式直接保存的编辑器(如 Notepad++ 或 Sublime Text)。

dos2unix这样,我的 boot2docker 会话中就不需要任何文件。