在 bash 中,我们可以使用 && 运算符来执行两个命令。例如:
./foo && ./bar
将首先执行foo
,并且只有当 foo “成功”时,它才会执行bar
。但是,当您考虑到 C 程序按照惯例返回 0 或exit(0)
成功完成时,这似乎违反直觉,这与&&
运算符的行为违反直觉。(因为在大多数语言中,0 被认为是“错误的”,因此会阻止第二条语句的执行。)我错过了什么?
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 退出状态更有意义。
你没有错过任何东西。您只需要记住这一点,true
并且false
不是 shell 中的基本概念。success
并且failure
是。
你错过了 Bash 的&&
运算符是这样定义的:
command1 &&
command2
command2当且仅当command1返回退出状态为零时才执行。