【问题标题】:How can I configure bash to handle CRLF shell scripts?如何配置 bash 来处理 CRLF shell 脚本?
【发布时间】:2013-01-14 14:38:01
【问题描述】:

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

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

是否存在强制 bash 处理 CRLF 的环境变量?

【问题讨论】:

  • 不,没有这样的环境变量。
  • 我几乎留下了一个虚假的答案——在 cygwin 上使用 bash,你可以做到 set -o igncr,并且有人谈到将其扩展到 Linux 上的 bash,但它显然从未发生过。

标签: linux windows bash line-endings


【解决方案1】:

大概是这样的?

dos2unix < script.sh|bash -s

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

bash <(dos2unix < script.sh)

【讨论】:

  • 如果脚本需要任何类型的输入,这将失败。在这些情况下,您可以使用bash &lt;(dos2unix yourscript)
  • 我想你的意思是bash &lt;(dos2unix &lt; yourscript)。否则它将转换文件并且不向标准输出写入任何内容。但是,是的,这是一个更好的选择。
【解决方案2】:

这里有一个透明的解决方法:

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

【讨论】:

  • 他们做不同的事情。 dos2unix 修改脚本,而这允许您在未修改的情况下运行它们(根据原始问题)。
  • 为什么要在每次运行时都修改脚本,而不是修改一次就完成? CPU 时间是免费的吗?
  • 无参数 dos2unix 从标准输入读取并写入标准输出(是一个过滤器),因此它不一定会修改文件。
  • 您要么必须修改文件,要么修改用于运行它的命令。这种方法不需要您修改任何内容。
  • 此解决方案不适用于采购 crlf 格式文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
  • 2015-05-17
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
相关资源
最近更新 更多