我有一个脚本,它使用#!/bin/sh
shebang与许多风格兼容如果这导致一个支持使用它的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