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

标签 windows bash docker newline

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

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

bash: ./script.sh: /bin/bash^M: bad interpreter: No such file or directory

有没有办法告诉 bash/sh 解释器自动将\r\n 转换为\n 并运行文件?

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

到目前为止,我发现的唯一可接受的解决方案是将 Git 设置为以 UNIX 格式 check out 源文件。

最佳答案

您可以在根文件夹中的 repo 中提交一个 .gitattributes 文件,以自动告诉 Git 在 checkout 时将 LF 行结尾应用于所有 .sh 文件,即使在 Windows 上也是如此。这样,您或其他开发人员就不必记住在您克隆存储库的每台机器上配置 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

关于windows - Bash - 使用 CRLF 行结尾无缝运行脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29603737/

相关文章:

c# - 应用程序在 Windows 7 任务栏上的位置

python - 如何打开位于 'This PC' 的 windows 资源管理器?

linux - 在打印特定菜单的 shell 脚本中需要帮助

bash - 为什么进程替换并不总是适用于 bash 中的 while 循环?

linux - bash中的shell脚本从ftp服务器下载文件

git - 启动新的Docker容器时未显示Gerrit更改

java - 使用 `start` 在 Windows 批处理文件中使用双引号启动进程的副作用

java - 将音频从 PC 流式传输到智能手机?

docker - 在Docker容器中以非root用户身份挂载卷

spring-boot - Spring boot插件docker OCI镜像和JasperReports