该命令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 结果没有变化
请帮助我了解这里出了什么问题?
该命令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 结果没有变化
请帮助我了解这里出了什么问题?
由于您否定了语句的退出状态
patch
,因此if
该if
语句可以读作“如果patch
失败,则输出字符串Pass
”。该
if
语句测试给定命令是成功 ( true ) 还是失败 ( false )。如果您愿意,您可以记住这一点并忘记此答案中的其余部分。当命令失败时,它的退出状态是非零的,可能允许更仔细地检查失败的原因。如果实用程序为返回的实际值赋予任何含义(例如
curl
,rsync
请参阅手册的最后部分),脚本可能会选择适当地处理错误。如果命令的退出状态为零,它会向 shell 发出实用程序成功完成的信号。
退出状态更多的是“错误代码”而不是“布尔值”或“真假”。true/false 布尔测试由测试退出状态的语句在内部执行,
if
以查看实用程序是否存在故障条件。如果不是(退出状态为零),则测试为true,即实用程序没有失败。你显然想说“除非 X 错了,做 Y”,来到一个否定的“如果”来表达“除非”,最后有效地否定了“错误”,所以你的“如果”完全成功 if (并且仅当)X 是错误的(请参阅@他们的答案)。这与退出代码无关,只是与否定的复杂性有关。