我在 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