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

时间:2013-01-30 17:13:03

标签: linux windows bash line-endings

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

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

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

2 个答案:

答案 0 :(得分:12)

也许是这样的?

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

bash <(dos2unix < script.sh)

答案 1 :(得分:8)

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

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

通过允许您执行所有系统的Windows CRLF脚本(如使用UNIX eol(带./yourscript)而不必为每个特定调用指定它,一劳永逸地解决了这个问题。 (请注意:bash yourscriptsource yourscript仍会失败)。

这是有效的,因为从UNIX的角度来看,DOS样式文件将解释器指定为“/ bin / bash ^ M”。我们覆盖该文件以从脚本中去除回车并在结果上运行实际的bash。

如果需要,您可以为/bin/sh等不同的解释器执行相同的操作。