我想执行碰巧使用Windows / CRLF行结尾的bash脚本。
我知道tofrodos包,以及如何fromdos
文件,但如果可能的话,我想在不做任何修改的情况下运行它们。
是否有一个环境变量会强制bash处理CRLF?
答案 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 yourscript
或source yourscript
仍会失败)。
这是有效的,因为从UNIX的角度来看,DOS样式文件将解释器指定为“/ bin / bash ^ M”。我们覆盖该文件以从脚本中去除回车并在结果上运行实际的bash。
如果需要,您可以为/bin/sh
等不同的解释器执行相同的操作。