C program return codes and && bash symbol?

2020-04-08 13:24发布

问题:

In bash, we can use the && operator to execute two commands. For example:

./foo && ./bar

Will first execute foo, and only if foo is "successful", it will then execute bar. However, this seems counter-intuitive when you consider that C programs, by convention, return 0 or exit(0) upon successful completion, which runs counter-intuitive to the behavior of the && operator. (Since in most languages, 0 is considered to be a 'falsey', and thus would stop the second statement from executing.) What am I missing?

回答1:

You're not missing anything. You just have to keep in mind that true and false aren't fundamental concepts in the shell. success and failure are.



回答2:

The C language convention that 0 is false and anything else true, is just that, a convention. Bash (and unix shells in general), use the opposite convention: 0 is true, anything else is false.

$ 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

Because of this, the true command always exits with a status of 0, while false exits with a status of 1.

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

This can be rather disconcerting for someone who's used to the C convention, but it makes a lot more sense in shell terms that truth=success=zero exit status, while false=failure=nonxero exit status.



回答3:

You are missing that Bash's && operator is defined thusly:

command1 && command2
command2 is executed if, and only if, command1 returns an exit status of zero.



标签: c bash shell unix