2012-07-30 78 views
4

在bash中,我们可以使用& &运算符来执行两个命令。例如:C程序返回码和&bash符号?

./foo && ./bar 

将首先执行foo,且仅当foo是“成功的”,这将执行bar。然而,当您认为C程序按照惯例在成功完成时返回0或exit(0),这与运算符&&的行为相反,这似乎与直觉相反。 (因为在大多数语言中,0被认为是'假的',因此会阻止第二个语句的执行。)我错过了什么?

回答

5

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

2

你缺少一个bash的&&运营商正是如此定义:

命令1&&命令2,如果
命令2执行,且仅当命令1返回零退出状态。

+1

更重要的是,zero_的_exit状态是_success_,其他都是失败。这实际上意味着_command2_只有在_command1_成功时才会执行。 – 2012-07-30 01:23:03

+1

记住这一点的方法是程序失败可能有很多原因,使用退出状态区分它们并不罕见。例如,如果找不到匹配的行,则grep的退出状态为1,但如果由于其他问题(例如文件未找到)而失败,则grep的退出状态为2。另一方面,在C编程中,true与false通常对应于某些事物与没有事物,并且没有任何事物表示为0。 – Barmar 2012-07-30 05:37:20

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命令始终为0的状态退出,而false出口与1

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

状态这是相当令人不安的人谁是用来到C约定,但在shell中,真实=成功=零退出状态会更有意义,而false =失败=非退出状态。