我有一个脚本,它使用#!/bin/sh shebang来兼容许多风格。* 如果 * 这导致一个支持它的shell被使用,我想运行set -o pipefail。我如何(a)检查shell是否支持pipefail,或者(B)尝试设置pipefail并在命令失败时“捕获”/抑制错误?
#!/bin/sh
set -o pipefail
pipefail
aydmsdu91#
Benjamin W.的回答是正确的--您可以使用2>/dev/null来隐藏错误消息,然后检查错误代码:
2>/dev/null
#!/bin/sh if ! set -o pipefail 2> /dev/null then : take some action if there is no pipefail option fi
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
2条答案
按热度按时间aydmsdu91#
Benjamin W.的回答是正确的--您可以使用
2>/dev/null
来隐藏错误消息,然后检查错误代码:e5nqia272#
Mark的答案对我来说在Dash-0.5.10.2-6中不起作用。
set -o pipefail
行一失败,脚本就退出,尽管它被!
“否定”。我在一个子shell中运行
set -o pipefail
,设法使它工作:请注意,如果成功,在当前脚本中实际上不会执行
set -o pipefail
,这就是为什么在else分支中再次执行它的原因。用Dash运行:
用Bash运行: