docker Bash -无缝运行带有CRLF行结尾的脚本

vvppvyoh  于 2023-11-17  发布在  Docker
关注(0)|答案(6)|浏览(141)

我使用VM(在我的情况下,简单地说就是boot 2docker)在Windows主机上运行docker容器。为了方便,我的源文件是从主机文件系统Map的,所以文本文件默认使用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格式的源文件。

1l5u6lss

1l5u6lss1#

您可以在根文件夹中的repo中提交一个.gitattributes文件,以自动告诉Git在 checkout 时对所有.sh文件应用LF行尾,即使在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

字符串

f45qwnt8

f45qwnt82#

对于某些脚本,解决方案ln -s /bin/bash /bin/bash^M将失败。
因此,创建一个脚本/bin/bash^M,它将dos 2unix它们获得的参数,并使用"$@"运行它们。
编辑:我尝试了以下bash^M脚本:

#!/bin/bash
PROG=$1
shift
dos2unix $PROG > /dev/null 2>&1
$PROG "$@"

字符串
当你的脚本包含其他带有点的脚本时,这将失败,在这种情况下,你应该避免这种变通方法,选择Unix。
你说你可以 checkout Unix,或者你可以自己改变文件。
并提交到git中,将unix文件以unix存储在git中是一个改进。当你真的想在windows下编辑它们时,请更改编辑器或dos 2unix的设置。

g2ieeal7

g2ieeal73#

我想你可以写一个脚本,

#!/bin/bash
#bash_run_unixified
#unixify and run in bash
dos2unix < "$1" | /bin/bash

字符串
假设您将其保存在/urs/local/bin/bash_run_unixified中,并具有适当的权限(sudo chmod o+r,o+x),那么您可以将脚本前缀为

#!/usr/local/bin/bash_run_unixified
#This script has CRLFs in it


如果你不想要这种不寻常的shebang线,你可以

$ ln -s /usr/local/bin/{bash_run_unixified,bash}


然后使用(正如Walter A.所指出的,将其链接到bash^M也是一个好主意)

#!/usr/bin/env bash


作为shebang行(/usr/local/bin/通常比/bin更靠近$PATH的开头,因此env命令应选择链接到bash_run_unixifiedbash)。
(Word注意:我还没有测试过这些)

mrphzbgm

mrphzbgm4#

最好的解决办法是确保使用编辑器(如Notepad++或Sublime Text),能够直接用适当的eol样式保存。
这样,我就不必在我的boot2docker会话中dos2unix任何文件。

z3yyvxxp

z3yyvxxp5#

我通过在bash脚本本身的第一行代码中放置一个oneliner(在#!/bin/bash行之后),成功地让带有CRLF行结尾的脚本“自我修复”。
唯一的问题是,脚本需要运行“bash script.sh“才能工作(当它有CRLF行结束符时)-我发现大多数用户在“./script.sh”不工作时都会这样做,所以这在大多数情况下救了我。在脚本修复自己之后,它不再有CRLF行结束符,正常执行它时使用“./script.sh”就可以正常工作了。
查看我的GitHub页面,了解oneliner(参见代码中的第3行)和readme

q43xntqr

q43xntqr6#

Visual Studio代码还擅长将行结尾更改为Linux或windows文件结尾

相关问题