我以为我知道 shell,但我被意想不到的行为咬伤了。
考虑这段代码:
#!/bin/bash
foo()
{
if false
then
echo success
else
return
fi
}
foo || echo failure
现在乍一看,人们会认为 else return
部分是多余的,但事实并非如此。代码原样输出失败
,但是当引用的部分被删除时,没有输出。
bash 手册解释(对于 if
):
The exit status is the exit status of the last command executed, or zero if no condition tested true.
不知何故,当命令失败时,我希望 if
失败。
想象一下 echo success
所在的位置实际上存在依赖命令,这些命令只有在主命令(此处为 false
)成功时才有意义。
这种意外行为背后的逻辑是什么?
见于 bash-4.4。 相关:https://stackoverflow.com/a/63884458/6607497
最佳答案
if
语句实际上从未用return
语句完成;该函数立即返回,退出状态由return
提供。该退出状态是 return
退出之前的最后一个命令的状态,即 false
。
没有 return
,if
确实 完成,并且如文档所述,if
的退出状态如果 if
子句或任何 elif
子句中的条件均未评估为真,则 command 定义为 0。这是有道理的,因为 if
语句成功确定不需要执行任何 if
或 elif
block 。
关于bash - 如果命令失败,为什么 `if` 语句的退出代码不是失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74362778/