为什么 Unix 命令在 Shell 中以非零值退出,并在 bash if 条件中使用时计算结果为 True?

为什么 Unix 命令在 Shell 中以非零值退出,并在 bash if 条件中使用时计算结果为 True?

该命令patch -R -p0 -s -f --dry-run < abc.patch失败,退出代码为 1,并打印 patch 命令的错误消息,但当在 if 条件中与否定一起使用时,它会通过(即打印 Pass),下面是代码

if ! patch -R -p0 -s -f --dry-run < abc.patch; then
         echo "Pass"
fi

我尝试了什么?我重定向了字符串 dev/null 结果没有变化

请帮我理解这里出了什么问题?

答案1

patch由于您否定了for语句的退出状态if,因此该if语句可以读作“如果patch失败,则输出字符串Pass”。

if语句测试给定命令是否成功(真的) 或失败 (错误的)。如果您愿意,您可以记住这一点并忘记此答案中的其余部分。

当命令失败时,其退出状态不为零,可能允许更仔细地检查失败的原因。如果实用程序为返回的实际值指定了任何含义(例如,curlrsync参阅其手册的最后部分),脚本可以选择适当地处理错误。

如果该命令的退出状态为零,则它向 shell 发出该实用程序已成功完成的信号。

退出状态更多的是“错误代码”而不是“布尔值”或“真或假”。 true/false 布尔测试是通过if测试退出状态的语句在内部执行的,以查看实用程序是否存在故障情况。如果不是(退出状态为零),则测试为真的,即实用程序没有失败。

答案2

你显然想说“除非X错了,就做Y”,用否定的“如果”来表达“除非”,最后有效地否定了“错误”,所以你的“如果”成功了,如果(并且只有当)X 是错误的(参见@他们的答案)。这与退出代码无关,只是与否定的复杂性有关。

相关内容