4

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

./foo && ./bar

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

4

3 回答 3

7

C 语言约定 0 为假,其他为真,这就是约定。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命令始终以状态 0false退出,而以状态 1 退出。

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

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

于 2012-07-30T05:30:57.383 回答
5

你没有错过任何东西。您只需要记住这一点,true并且false不是 shell 中的基本概念。success并且failure是。

于 2012-07-30T01:16:11.063 回答
2

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

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

于 2012-07-30T01:13:19.053 回答