La logica qui è che il tuo uso di &&
già è controllo degli errori. Allo stesso modo in cui bash non tratta un errore all'interno di un if
condizione che valga la pena di abortire, anche con set -e
.
Quando racchiudi i comandi tra parentesi, stai effettivamente eseguendo quei comandi all'interno di una subshell, quindi lo script stesso vede solo il ritorno di quella subshell, cioè:non è a conoscenza che &&
è coinvolto, quindi si interrompe come previsto.
Cita il manuale di riferimento:
La shell non esce se il comando che fallisce fa parte dell'elenco dei comandi che segue immediatamente una parola chiave while o until, parte del test in un'istruzione if, parte di qualsiasi comando eseguito in un &&o || list tranne il comando che segue il finale &&o ||, qualsiasi comando in una pipeline tranne l'ultimo, o se lo stato di ritorno del comando viene invertito con !