“set -eo pipefail”在 Windows Subsystem for Linux(Ubuntu 16.04)中不起作用

“set -eo pipefail”在 Windows Subsystem for Linux(Ubuntu 16.04)中不起作用

我在 Windows 10 机器上安装了适用于 Linux 的 Windows 子系统,该机器应该模拟 Ubuntu 16.04。当我尝试执行脚本顶部包含以下两行的脚本时,它给出了错误:invalid option name set: pipefail

脚本行:

#!/bin/bash
set -eo pipefail

此脚本在我的 Mac 和 CentOS 系统上运行良好。我已通过运行检查(并验证)了我的 Ubuntu shell,以确保它支持 bash 中的 pipefail 选项set -o

的输出cat -net /path/to/myscript为:

#!/bin/bash^M$
set -eo pipefail^M$

这个问题被标记为“如何将 Windows 行尾更改为 Unix 版本”的重复,但我不认为它与那个问题重复,因为我个人不知道我遇到的问题(我的问题中概述的)是由我的 shell 脚本中的行尾类型引起的。每个问题的答案都相同,但提出了 2 个不同的问题。

答案1

^M如输出中的序列所示cat -net,您已使用 Windows 样式(CRLF)行尾而不是 Unix 样式(仅 LF)保存了脚本

事实上,我们可以从截断的错误消息中猜出:“真正的”错误是这pipefail\r是一个无效的选项名称。但是,回车会导致光标重置到行首并覆盖前面的字符。比较

$ cat -net bad.sh
     1  #!/bin/bash$
     2  set -eo fhqwhgads$

$ ./bad.sh
./bad.sh: line 2: set: fhqwhgads: invalid option name

$ cat -net bad.sh
     1  #!/bin/bash$
     2  set -eo pipefail^M$

$ ./bad.sh
: invalid option name: pipefail

相关内容