Shell 使用Set-e,如何对一个命令进行异常处理

Shell 使用Set-e,如何对一个命令进行异常处理,shell,unix,Shell,Unix,在shell脚本中使用set-e,可以让进程 如果其中一个命令以非零状态退出,则立即退出 但是,如果我想排除一个命令,那么如果该特定命令以非零值退出,该过程将继续。第一条规则,不要使用set-e。第二条规则,见规则1。set-e的实现在边缘情况下具有奇怪的行为,并且在不同版本的shell中发生了变化。不使用它是最安全的。但是,只需将命令作为复合命令的一部分,就可以抑制它。也就是说,而不是 cmd\u哪个可能会失败 您可以简单地执行以下操作: cmd_哪个可能失败| | true 现在,如果可能失

在shell脚本中使用
set-e
,可以让进程 如果其中一个命令以非零状态退出,则立即退出


但是,如果我想排除一个命令,那么如果该特定命令以非零值退出,该过程将继续。

第一条规则,不要使用
set-e
。第二条规则,见规则1。
set-e
的实现在边缘情况下具有奇怪的行为,并且在不同版本的shell中发生了变化。不使用它是最安全的。但是,只需将命令作为复合命令的一部分,就可以抑制它。也就是说,而不是

cmd\u哪个可能会失败

您可以简单地执行以下操作:

cmd_哪个可能失败| | true


现在,如果可能失败的
cmd\u失败,脚本将不会退出。

第一条规则,不要使用
set-e
。第二条规则,见规则1。
set-e
的实现在边缘情况下具有奇怪的行为,并且在不同版本的shell中发生了变化。不使用它是最安全的。但是,只需将命令作为复合命令的一部分,就可以抑制它。也就是说,而不是

cmd\u哪个可能会失败

您可以简单地执行以下操作:

cmd_哪个可能失败| | true

现在,如果可能失败的
cmd\u失败,脚本将不会退出。

我通常会退出

command ||:
的返回状态为零。如果
命令
返回非零状态,则执行
,返回零状态。如果
命令
返回零状态,则不执行
。在这两种情况下,返回状态均为零,即成功

我看到:

command |:
嗯。。。虽然短了一个字符,但将标准输出绑定到
进程对我来说似乎是在浪费cpu时间。管道的返回状态是上次执行的命令的返回状态,它是
。但是当
设置-o pipefail
时,这可能会失败,所以我不推荐使用它

您可以在子shell中运行命令:

( set +e; command; )
这允许更大的灵活性,但您需要在命令之前添加
),而且打字要多得多。

我通常这样做

command ||:
的返回状态为零。如果
命令
返回非零状态,则执行
,返回零状态。如果
命令
返回零状态,则不执行
。在这两种情况下,返回状态均为零,即成功

我看到:

command |:
嗯……它短了一个字符,但是将stdout绑定到
进程对我来说似乎是在浪费cpu时间。管道的返回状态是最后执行的命令的返回状态,它是
。但是当
设置-o pipefail
时,这可能会失败,所以我不推荐使用它

您可以在子shell中运行命令:

( set +e; command; )

这允许更大的灵活性,但您需要添加
在命令之前,输入要多得多。

| |:
|:
好得多,原因不仅仅是CPU时间——使用
|:
公式,您可以在左侧更改shell状态,而无需将更改隔离到子shell;它还可以避免所有有趣的信号处理副作用,避免重新运行ng文件描述符等。
| |:
|:
好得多,原因不仅仅是CPU时间——使用
|:
公式,您可以在左侧更改shell状态,而无需将更改隔离到子shell;它还可以避免所有有趣的信号处理副作用,避免重新路由文件描述符等。请参阅t在评估
set-e
是否是一个好主意时,请参阅,在评估
set-e
是否是一个好主意时,请参阅。