&& shell operator is used in two common contexts. First, to chain commands like
; does, but stop on failure. For example:
$ mkdir foo && cd foo && echo 'done!' && cd .. done! $ mkdir foo && cd foo && echo 'done!' && cd .. mkdir: foo: File exists
The directory existed on the second try, so
$?, the error code, to 1. An error code of 0 is success; non-zero is failure. The
&& operator saw that
$? was non-zero, meaning that the
mkdir failed, so it exited.
The second common application of
&& is within comparisons: you can use it in conditionals as a logical "and" operator. It acts as you'd expect it to act in any other programming language:
$ if [ 1 = 1 ] && true; then echo ok; fi ok $ if [ 1 = 100 ] && true; then echo ok; fi $ if [ 1 = 1 ] && false; then echo ok; fi
Above, we saw that the
&& operator continues executing only if the previous command sets
$? to 0, the success value. Which means...
In shell conditionals, the true things are 0 and the false things are 1! I know – it's Wrong, but it also makes everything Just Work.
Oh... and one more thing.
[ are all programs:
$ which true false [ /usr/bin/true /usr/bin/false /bin/[
Noodle on that for a while! Which program knows what
= means? Why is the
] there when using a conditional at the shell? (Isn't it just a meaningless argument passed to
(Seriously – think about these questions before proceeding.)
I'm not going to answer them, but I will show you this:
$ /bin/[ 1 = 1; echo $? 0 $ /bin/[ 1 = 2; echo $? 1
(This post started as an aside in The Tar Pipe that didn't make the cut. See that post for more Unix bits.)