&&
est un opérateur logique. ;
est un simple séquençage.
En cmd1 && cmd2
cmd2 ne sera exécuté que si cmd1 se termine avec un code de retour réussi.
Considérant que dans cmd1; cmd2
cmd2 s'exécutera quel que soit l'état de sortie de cmd1 (en supposant que vous n'avez pas configuré votre Shell pour sortir sur tout échec dans votre Shell ou autre).
Sur une note connexe, avec cmd1 || cmd2
en utilisant le ||
Opérateur logique 'OR', cmd2 ne sera exécuté que si cmd1 échoue (renvoie un code de sortie non nul).
Ces opérateurs logiques sont parfois utilisés dans les scripts à la place d'une instruction if de base. Par exemple,
if [[ -f "$foo" ]]; then mv "$foo" "${foo%.txt}.mkd"; fi
...peut être réalisé de manière plus concise avec :
[[ -f "$foo" ]] && mv "$foo" "${foo%.txt}.mkd"