A || B ; C
se A sair com um status diferente de zero, execute B. C é executado incondicionalmente
A ; B || C
execute A. Em seguida, execute B. Se B sair com um status diferente de zero, execute C
Tangencialmente, às vezes você verá A && B || C
. Isso geralmente é uma forma abreviada de if A; then B; else C; fi
. No entanto, há uma grande diferença:
A && B || C
- Se A falhar, execute C
- se A for bem-sucedido, execute B.
- se B falhar, execute C
if A; then B; else C; fi
- Se A falhar, execute C
- se A for bem-sucedido, execute B.
- se B falhar, C NÃO será executado
Uma demonstração:
$ (echo A; exit 0) && (echo B; exit 1) || (echo C; exit 2); echo $?
A
B
C
2 # <== the exit status of C
$ if (echo A; exit 0); then (echo B; exit 1); else (echo C; exit 2); fi; echo $?
A
B
1 # <== the exit status of B