&&
é um operador lógico. ;
é um sequenciamento simples.
Em cmd1 && cmd2
, o cmd2 só será executado se o cmd1 sair com um código de retorno bem-sucedido.
Considerando que em cmd1; cmd2
, cmd2 será executado independentemente do status de saída de cmd1 (supondo que você não tenha configurado seu shell para sair em todas as falhas em seu script ou algo assim).
Em uma nota relacionada, com cmd1 || cmd2
, usando o operador lógico ||
'OR', o cmd2 só será executado se o cmd1 falhar (retorna um código de saída diferente de zero).
Esses operadores lógicos às vezes são usados em scripts no lugar de uma instrução if básica. Por exemplo,
if [[ -f "$foo" ]]; then mv "$foo" "${foo%.txt}.mkd"; fi
... pode ser mais concisamente alcançado com:
[[ -f "$foo" ]] && mv "$foo" "${foo%.txt}.mkd"