Aquí, sólo el segundo eco alimenta al grep.
$ echo a1; echo a2 | grep -o a
a1
a
Aquí ambos ecos lo hacen.
$ { echo a1; echo a2 ;} | grep -o a
a
a
Aquí también.
$ (echo a1; echo a2 )| grep -o a
a
a
Entonces, ¿cuál es la diferencia entre () y {}?
Respuesta1
Los paréntesis redondos introducen una subcapa.
$ a=1; { a=2 ; echo $a ; } ; echo $a
2
2
$ a=1; ( a=2 ; echo $a ; ) ; echo $a
2
1
Eso sí, eso $$
permanece igual en el subshell porque no es necesario reinicializar bash. $BASHPID
cambios, sin embargo.