12

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

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

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

4

2 回答 2

12

也许像这样?

dos2unix < script.sh|bash -s

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

bash <(dos2unix < script.sh)
于 2013-01-30T17:54:07.283 回答
8

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

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

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

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

如果你愿意,你可以对不同的口译员做同样的事情/bin/sh

于 2013-01-30T17:56:21.167 回答