如何配置bash来处理CRLF shell脚本?

mca*_*dre 12 linux windows bash line-endings

我想执行碰巧使用Windows/CRLF行结尾的bash脚本.

我知道tofrodos包,以及如何fromdos文件,但如果可能的话,我想在没有任何修改的情况下运行它们.

是否有一个环境变量会强制bash处理CRLF?

Mag*_*son 12

也许是这样的?

dos2unix < script.sh|bash -s
Run Code Online (Sandbox Code Playgroud)

编辑:正如评论中所指出的,这是更好的选择,因为它允许脚本通过运行dos2unix而不是bash在子shell中读取stdin:

bash <(dos2unix < script.sh)
Run Code Online (Sandbox Code Playgroud)

  • 如果脚本需要任何类型的输入,这将失败.在这些情况下,您可以使用`bash <(dos2unix yourscript)` (2认同)
  • 我认为你的意思是'bash <(dos2unix <yourscript)`.否则它将转换文件并向stdout写入任何内容.但是,是的,这是一个更好的选择. (2认同)

tha*_*guy 8

这是一个透明的解决方法:

cat > $'/bin/bash\r' << "EOF"
#!/bin/bash
script=$1
shift
exec bash <(tr -d '\r' < "$script") "$@"
EOF
Run Code Online (Sandbox Code Playgroud)

通过允许您执行所有系统的Windows CRLF脚本,就像它们使用UNIX eol(with ./yourscript)一样,而不必为每个特定的调用指定它,这一劳永逸地解决了这个问题.(要注意:bash yourscript或者source yourscript仍然会失败).

它的工作原理是,从UNIX的角度来看,DOS样式文件将解释器指定为"/ bin/bash ^ M".我们覆盖该文件以从脚本中去除回车并在结果上运行实际的bash.

你也可以为不同的解释者做同样的事情/bin/sh.

  • 如果已有`dos2unix`工具,为什么要重新发明轮子? (2认同)
  • 他们做不同的事情.dos2unix修改脚本,而这允许您不加修改地运行它们(根据原始问题). (2认同)