在bash中,我们可以使用& &运算符来执行两个命令。例如:C程序返回码和&bash符号?
./foo && ./bar
将首先执行foo
,且仅当foo是“成功的”,这将执行bar
。然而,当您认为C程序按照惯例在成功完成时返回0或exit(0)
,这与运算符&&
的行为相反,这似乎与直觉相反。 (因为在大多数语言中,0被认为是'假的',因此会阻止第二个语句的执行。)我错过了什么?
在bash中,我们可以使用& &运算符来执行两个命令。例如:C程序返回码和&bash符号?
./foo && ./bar
将首先执行foo
,且仅当foo是“成功的”,这将执行bar
。然而,当您认为C程序按照惯例在成功完成时返回0或exit(0)
,这与运算符&&
的行为相反,这似乎与直觉相反。 (因为在大多数语言中,0被认为是'假的',因此会阻止第二个语句的执行。)我错过了什么?
你不会错过任何东西。你只需要记住,true
和false
不是shell中的基本概念。 success
和failure
是。
你缺少一个bash的&&
运营商正是如此定义:
命令1&&
命令2,如果
命令2执行,且仅当命令1返回零退出状态。
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 =失败=非退出状态。
更重要的是,zero_的_exit状态是_success_,其他都是失败。这实际上意味着_command2_只有在_command1_成功时才会执行。 – 2012-07-30 01:23:03
记住这一点的方法是程序失败可能有很多原因,使用退出状态区分它们并不罕见。例如,如果找不到匹配的行,则grep的退出状态为1,但如果由于其他问题(例如文件未找到)而失败,则grep的退出状态为2。另一方面,在C编程中,true与false通常对应于某些事物与没有事物,并且没有任何事物表示为0。 – Barmar 2012-07-30 05:37:20