我很好奇shell中连续命令执行中&&
背后的逻辑。
让我们看一个例子:command_a && command_b && command_c
在shell中,这意味着一旦命令失败,后续命令将不会执行,链应该停止。
如果我们用退出代码替换每个命令,则链变为,例如此表达式0 && 1 && 0
。 (command_a
成功,command_b
失败,command_c
成功)
如果我们尝试评估此表达式,评估应该在第一个命令0
值之后立即停止。
如果&&
逻辑被||
替换,则表达式将更符合原始链式命令的含义。
0 || 1 || 0
。
表达式的评估在执行command_b
后停止
答案 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。彼得的另一个答案很好地解释了这一点。无论如何,我原来的答案都是站着的,因为它不是"错误"。
相反,如果您有某些东西"从网络,缓存或磁盘中检索文档,或者按照此优先顺序"采取默认的此处文档,则以适当的方式写这确实与逻辑OR。这种情况发生但不常见。
ORing是一种常见的习惯用法,但是对于错误处理,因为如果以前的命令失败,则会完全执行后续命令。考虑一下Perl的惯用语cmd() || die();
。 (你有更多的生命.Phew。)