shell 在/bin/sh中有条件地设置“-o pipefail”

uoifb46i  于 2023-02-24  发布在  Shell
关注(0)|答案(2)|浏览(158)

我有一个脚本,它使用#!/bin/sh shebang来兼容许多风格。* 如果 * 这导致一个支持它的shell被使用,我想运行set -o pipefail
我如何(a)检查shell是否支持pipefail,或者(B)尝试设置pipefail并在命令失败时“捕获”/抑制错误?

aydmsdu9

aydmsdu91#

Benjamin W.的回答是正确的--您可以使用2>/dev/null来隐藏错误消息,然后检查错误代码:

#!/bin/sh

if 
  ! set -o pipefail 2> /dev/null   
then
  : take some action if there is no pipefail option
fi
e5nqia27

e5nqia272#

Mark的答案对我来说在Dash-0.5.10.2-6中不起作用。set -o pipefail行一失败,脚本就退出,尽管它被!“否定”。
我在一个子shell中运行set -o pipefail,设法使它工作:

#!/bin/sh

if ! (set -o  pipefail 2>/dev/null); then
    echo "There is no pipefail"
else
    echo "Setting pipefail"
    set -o pipefail
fi

false | true
echo "false | true -> $?"

请注意,如果成功,在当前脚本中实际上不会执行set -o pipefail,这就是为什么在else分支中再次执行它的原因。
用Dash运行:

$ dash ./pipefail.sh 
There is no pipefail
false | true -> 0

用Bash运行:

$ bash ./pipefail.sh 
Setting pipefail
false | true -> 1

相关问题