有条件地在 /bin/sh 中设置"-o pipefail"



我有一个脚本,它使用#!/bin/shshebang与许多风格兼容如果这导致一个支持使用它的shell,我想运行set -o pipefail

我如何(a(检查shell是否支持pipefail,或者(b(尝试设置pipefail和";捕获"/如果该命令失败,是否抑制该错误?

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

Mark的回答对我使用Dash-0.55.10.2-6不起作用。一旦set -o pipefail行出现故障,脚本就会退出,尽管它被!"否定"。

我通过在一个子外壳中运行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

相关内容

  • 没有找到相关文章

最新更新