& & É o AND lógico:
& & é uma maneira de expressar E lógico , significando que a expressão inteira é verdadeira somente se ambos os lados dela forem verdade. Na lógica, diz-se que a declaração inteira (P & Q) só é verdadeira quando P e Q são verdadeiros.
Como consequência disso, os computadores geralmente tratam a P & Q como uma avaliação de curto-circuito . Então, uma vez que toda a declaração será apenas True se P e Q forem verdadeiros, então, se P for falso, a instrução Q não será avaliada. Basicamente, os computadores são preguiçosos (eficientes) e não se incomodam em avaliar Q se eles também não tiverem. Isso também é verdadeiro da OR lógica, veja o link anterior.
Os três contextos de & & no Bash:
1) Usando avaliação de curto-circuito com o status de saída de um comando:
Todo comando tem um status de saída. Se um comando tiver um erro, ele terá um status de saída diferente de zero. Portanto, se o status de saída for diferente de zero e & & é usado para encadear comandos em uma instrução, os comandos posteriores não serão avaliados (executados) se o anterior não tiver um status de saída igual a 0 (True). Isso é por causa da avaliação de curto-circuito. Então, se você tem:
P && Q
Q não será executado se P não for verdadeiro (se P sair com um status diferente de 0, isso não é verdade). Apenas o mesmo que:
./configure && make
make não será executado se o configure tiver um erro, não é verdade. Então, basicamente, acaba sendo uma maneira de escrever na declaração if:
if ./configure ; then
make
fi
Tenha em mente que, na maioria dos contextos, 0 é falso, mas não quando se trata de um status de saída.
2) & & Pode ser usado no comando [[]] test do Bash:
& & Também pode ser usado dentro do comando de teste embutido no bash [[]] para combinar expressões de maneira similar à combinação de comandos. Toda a operação de teste só será verdadeira se ambos os operandos (lados) de & & são verdadeiras, por exemplo:
if [[ ( $a -gt 2 ) && ( $a -lt 5 ) ]]; then ...
seria uma maneira de dizer se $ a é um inteiro entre 2 e 5 (não incluindo 2 e 5).
3) Avaliação Aritmética:
Por fim, & & pode ser usado na avaliação aritmética como Logical AND. Se ambos (AND lógico) dos números a seguir forem diferentes de zero, retornará 0, senão 1 será retornado:
kbrandt@desktop:~/$ echo $((1 & 1))
1
kbrandt@desktop:~/$ echo $((0 && 1))
0