为什么AND&&逻辑用于大多数shell中的链式命令,而不是OR ||逻辑

时间:2017-03-02 14:34:25

标签: bash shell logic

我很好奇shell中连续命令执行中&&背后的逻辑。

让我们看一个例子:command_a && command_b && command_c

在shell中,这意味着一旦命令失败,后续命令将不会执行,链应该停止。

如果我们用退出代码替换每个命令,则链变为,例如此表达式0 && 1 && 0。 (command_a成功,command_b失败,command_c成功)

如果我们尝试评估此表达式,评估应该在第一个命令0值之后立即停止。

如果&&逻辑被||替换,则表达式将更符合原始链式命令的含义。 0 || 1 || 0

表达式的评估在执行command_b后停止

4 个答案:

答案 0 :(得分:4)

成功命令的语义与通过退出代码的数值表示成功之间存在差异。如果你认为摘要“是一个成功的命令”,&&更有意义,因为“成功”抽象布尔值是真的。这就是为什么&&用来。您需要A才能运行,并且您需要B才能运行。

但是,由于事实上通常只有一个成功状态,但是许多不同类型的错误,很久以前就定义了值0用于退出状态以表示成功。

因此,命令的退出状态不能在这样的表达式中替换命令本身。语义和表示只是不同。

答案 1 :(得分:1)

查看此post

“仅当左侧的退出状态为零时,才会评估&&的右侧。||是相反的:仅当左侧退出状态为非零时,它才会评估右侧。 。“

$ false && echo howdy!

$ true && echo howdy!
howdy!
$ true || echo howdy!

$ false || echo howdy!
howdy!

答案 2 :(得分:1)

我在某些shell脚本中也看到了||。我认为这取决于场合。只有在command-a && command-b成功后才能执行command-b,您可以使用command-a

同样,您可以使用command-a || command-b来处理command-a失败时的情况。

答案 3 :(得分:0)

更新:在三次阅读你的问题后,我现在明白了你的困惑:0表示成功,和/或(原文如此)逻辑运算符将其视为true。是的,这可能令人困惑,来自C。彼得的另一个答案很好地解释了这一点。无论如何,我原来的答案都是站着的,因为它不是"错误"。

<小时/> 如果命令不可能执行,或者除非他们的前辈成功,否则这是逻辑决定的。这种情况经常发生:&#34;从Web检索HTML文档,验证时间戳,从中解析一个值,并将该值写为某处的更新数据。&#34;每个步骤取决于所有前面步骤的成功。

相反,如果您有某些东西&#34;从网络,缓存或磁盘中检索文档,或者按照此优先顺序&#34;采取默认的此处文档,则以适当的方式写这确实与逻辑OR。这种情况发生但不常见。

ORing是一种常见的习惯用法,但是对于错误处理,因为如果以前的命令失败,则会完全执行后续命令。考虑一下Perl的惯用语cmd() || die();。 (你有更多的生命.Phew。)