Set -e-如何排除一个命令

时间:2018-12-19 22:47:11

标签: shell unix

我知道将set -e放在shell脚本中可以起到以下作用: “如果命令以非零状态退出,则立即退出。”

但是,如果我要排除一个命令,以便即使该特定命令以非零值退出,该过程也会继续。我不知道该怎么做。

谢谢

2 个答案:

答案 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; )

这可以提供更大的灵活性,但是您需要在命令前添加(,而且键入得多。