【问题标题】:C program return codes and && bash symbol?C程序返回码和&& bash符号?
【发布时间】:2012-07-30 01:07:55
【问题描述】:

在 bash 中,我们可以使用 && 运算符来执行两个命令。例如:

./foo && ./bar

将首先执行foo,并且只有当foo“成功”时才会执行bar。但是,当您考虑到 C 程序按照惯例在成功完成后返回 0 或 exit(0) 时,这似乎违反直觉,这与 && 运算符的行为违反直觉。 (因为在大多数语言中,0 被认为是“错误”,因此会阻止第二条语句的执行。)我错过了什么?

【问题讨论】:

    标签: c bash shell unix


    【解决方案1】:

    0 为假而其他任何东西为真的 C 语言约定就是这样,约定。 Bash(和一般的 unix shell),使用相反的约定:0 为真,其他为假。

    $ if ( exit 0 ); then echo true; else echo false; fi
    true
    $ if ( exit 1 ); then echo true; else echo false; fi
    false
    $ if ( exit 2 ); then echo true; else echo false; fi
    false
    

    因此,true 命令总是以状态 0 退出,而 false 以状态 1 退出。

    $ true; echo $?
    0
    $ false; echo $?
    1
    

    这对于习惯 C 约定的人来说可能相当令人不安,但在 shell 术语中,truth=success=zero 退出状态,而 false=failure=nonxero 退出状态更有意义。

    【讨论】:

      【解决方案2】:

      你没有错过任何东西。您只需要记住truefalse 不是shell 中的基本概念。 successfailure 是。

      【讨论】:

        【解决方案3】:

        你错过了 Bash 的 && 运算符是这样定义的:

        command1 && command2
        command2 当且仅当 command1 返回时执行退出状态为零。

        【讨论】:

        • 更重要的是,退出状态为零成功,其他都是失败。这实际上意味着 command2 只有在 command1 成功时才会执行。
        • 记住这一点的方法是,程序失败的原因可能有很多,使用退出状态来区分它们并不少见。例如,如果没有找到匹配的行,则 grep 的退出状态为 1,但如果由于其他问题(例如找不到文件)而失败,则为 2。另一方面,在 C 编程中,真与假通常对应于有与无,没有用 0 表示。
        猜你喜欢
        • 1970-01-01
        • 2022-07-09
        • 2023-03-15
        • 2012-01-14
        • 2014-06-25
        • 1970-01-01
        • 2011-01-19
        • 1970-01-01
        • 2023-03-18
        相关资源
        最近更新 更多