“set -eo pipefail”在适用于 Linux 的 Windows 子系统(Ubuntu 16.04)中不起作用

phy*_*man 7 bash windows-10 16.04 windows-subsystem-for-linux

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

脚本行:

#!/bin/bash
set -eo pipefail
Run Code Online (Sandbox Code Playgroud)

这个脚本在我的 Mac 和我拥有的 CentOS 系统上运行良好。我已经检查(并验证)了我的 Ubuntu shell,以确保它通过运行set -o.

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

#!/bin/bash^M$
set -eo pipefail^M$
Run Code Online (Sandbox Code Playgroud)

这个问题被标记为“How to change Windows line-ending to Unix version”的重复,但我不认为它是重复的,因为我个人不知道我遇到的问题(在我的问题中概述)是由我的 shell 脚本中的行尾类型引起的。每个问题的答案都是相同的,但提出了 2 个不同的问题。

ste*_*ver 9

如输出中的^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
Run Code Online (Sandbox Code Playgroud)

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

$ ./bad.sh
: invalid option name: pipefail
Run Code Online (Sandbox Code Playgroud)