&&é um operador lógico. ;é um sequenciamento simples.
Em cmd1 && cmd2, o cmd2 será executado apenas se o cmd1 sair com um código de retorno bem-sucedido.
Enquanto que o cmd1; cmd2cmd2 será executado independentemente do status de saída do cmd1 (supondo que você não tenha configurado o shell para sair em todas as falhas do script ou algo assim).
Em uma nota relacionada, com o cmd1 || cmd2uso do ||operador lógico 'OR', o cmd2 será executado apenas 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 alcançado de forma mais concisa com:
[[ -f "$foo" ]] && mv "$foo" "${foo%.txt}.mkd"
& (simple sequencing), && (conditional AND) and || (conditional OR).