La logique ici est que votre utilisation de && est déjà vérification des erreurs. De la même manière, bash ne traite pas un échec dans un if condition vaut la peine d'être abandonnée, même avec set -e .
Lorsque vous placez les commandes entre parenthèses, vous exécutez en fait ces commandes dans un sous-shell, de sorte que le script lui-même ne voit que le retour de ce sous-shell, c'est-à-dire :il ne sait pas que && est impliqué du tout, donc il s'interrompt comme prévu.
Citons le manuel de référence :
Le shell ne se ferme pas si la commande qui échoue fait partie de la liste de commandes suivant immédiatement un mot-clé while ou until, fait partie du test dans une instruction if, fait partie de toute commande exécutée dans un &&ou || liste sauf la commande suivant le &&ou || final, toute commande dans un pipeline sauf la dernière, ou si le statut de retour de la commande est inversé avec !