bash - 如果命令失败,为什么 `if` 语句的退出代码不是失败?

标签 bash if-statement error-handling

我以为我知道 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

没有 returnif 确实 完成,并且如文档所述,if 的退出状态如果 if 子句或任何 elif 子句中的条件均未评估为真,则 command 定义为 0。这是有道理的,因为 if 语句成功确定不需要执行任何 ifelif block 。

关于bash - 如果命令失败,为什么 `if` 语句的退出代码不是失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74362778/

相关文章:

c++ - 如何用 if 语句替换预处理器宏?

ios - Objective-C:如果语句仅在第二次尝试后运行(iOS)

java - httpTransport.call(SOAP_ACTION,信封);引发null异常Android

linux - Shell 表示法 : find . -type f -exec file '{}'\;

linux - 如何在 bash 中将给定文本拆分为 3 个变量并发送到端口主机?

r - 条件列创建(水平和垂直条件)

ruby-on-rails - PG::ConnectionBad Error when trying to run rake db:migrate 在创建模型后,使用 postgresql

php - 如何重定向 artisan 修补程序输出?

bash - 如何使用带有 shell 函数的 git 别名来构建提交消息

error-handling - 在vb6-Closed中调用Err.Raise时,应用程序定义或对象定义的错误