Linux/Ubuntu设置:非法选项-o pipefail。

27
以下代码一直在Ubuntu 16.04发行版上正常工作,但是突然出现了选项名称pipefail是非法选项的情况:
set -eu -o pipefail

返回结果:

set: 非法选项 -o pipefail

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

myscript.sh:

1 #!/bin/bash
2 set -eu -o pipefail
3 ...

这个脚本需要以sudo权限运行:

sudo sh ./myscript.sh

2个回答

42

你正在运行bin/sh,在Ubuntu中它是一个指向/bin/dash的符号链接,但pipefail是Bash的特性。

使脚本可执行:

chmod +x myscript.sh

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

sudo ./myscript.sh

1
这个方法有效是因为脚本以#!/bin/bash开头,内核在直接执行时会遵循这个指令。sudo bash myscript.sh也可以工作,但和前面的情况一样,需要调用脚本的人知道它是用哪种方言编写的;依赖于shebang是很好的,因为脚本是自说明的,你可以随后自由地将其重写为不同的shell(或者python等等,甚至是本地可执行文件)。 - undefined
pipefail不仅仅适用于bash,还受到多个shell的支持,但不适用于dash。但是专注于bash是很好的,例如,它允许您打印更友好的错误信息,依赖于其他bash功能:trap 's=$? p=("${PIPESTATUS[@]}"); echo "$0: Error ${p[*]} on line $LINENO: $BASH_COMMAND"; exit $s' ERR; set -u -o pipefail - undefined

15

当我从zsh运行脚本时,如果脚本以错误的shebang开头,我会遇到相同的错误。

#后面缺少 ! 是错误的:

#/bin/bash
rest-of-the-script

正确:

#!/bin/bash
rest-of-the-script

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接