Linux/Ubuntu 集:非法选项 -o pipefail

sai*_*tam 12 linux shell ubuntu set ubuntu-16.04

下面提到的代码行一直在 Ubuntu 16.04 发行版上为我工作,但突然间 option-namepipefail是一个非法选项:

set -eu -o pipefail
Run Code Online (Sandbox Code Playgroud)

返回:

设置:非法选项 -o pipefail

为什么会发生这种情况?我在全新安装的系统上运行该命令并作为 shell 脚本的一部分。代码放在开头:

我的脚本.sh:

1 #!/bin/bash
2 set -eu -o pipefail
3 ...
Run Code Online (Sandbox Code Playgroud)

该脚本作为 sudo 运行:

sudo sh ./myscript.sh
Run Code Online (Sandbox Code Playgroud)

l0b*_*0b0 20

你正在运行bin/sh,在 Ubuntu 上它是一个指向 的符号链接/bin/dash,但它pipefail是一种bashism。

使脚本可执行:

chmod +x myscript.sh
Run Code Online (Sandbox Code Playgroud)

然后按如下方式运行脚本:

sudo ./myscript.sh
Run Code Online (Sandbox Code Playgroud)

  • 这是有效的,因为脚本以 shebang `#!/bin/bash` 开头,内核在直接执行它时会尊重它。`sudo bash myscript.sh` 也可以工作,但与之前的情况一样,它要求脚本的调用者知道它到底是用哪种方言编写的;依赖 shebang 很棒,因为脚本是自记录的,您可以稍后将其重写为不同的 shell(或 python 等,甚至本机可执行文件) (2认同)

Mik*_*ike 15

我在运行脚本时遇到了同样的错误,zsh并且脚本以不正确的shebang 开头。

错误,!之后丢失#

#/bin/bash
rest-of-the-script
Run Code Online (Sandbox Code Playgroud)

正确的:

#!/bin/bash
rest-of-the-script
Run Code Online (Sandbox Code Playgroud)