我知道将set -e
放在shell脚本中可以起到以下作用:
“如果命令以非零状态退出,则立即退出。”
但是,如果我要排除一个命令,以便即使该特定命令以非零值退出,该过程也会继续。我不知道该怎么做。
谢谢
答案 0 :(得分:1)
第一条规则,请勿使用set -e
。第二条规则,请参见规则1。set -e
的实现在边缘情况下具有奇怪的行为,并且已通过各种版本的Shell进行了更改。不使用它是最安全的。但是,您可以简单地通过使命令成为复合命令的一部分来抑制它。也就是说,代替
cmd_which_may_fail
您可以简单地做到:
cmd_which_may_fail || true
现在,如果cmd_which_may_fail
确实失败了,脚本将不会退出。
答案 1 :(得分:1)
我通常会
command ||:
:
的返回状态为零。如果command
返回非零状态,则执行:
,返回零状态。如果command
返回零状态,则不会执行:
。在两种情况下-返回状态均为零,即。成功。
我看过:
command |:
嗯...短了一个字符,但是将stdout绑定到:
进程对我来说似乎浪费了CPU时间。管道的返回状态是最后执行的命令的返回状态,它是:
。但这会在set -o pipefail
时失败,所以我不推荐它。
您可以在子shell中运行命令:
( set +e; command; )
这可以提供更大的灵活性,但是您需要在命令前添加(
,而且键入得多。