Aqui, apenas o segundo eco alimenta o grep.
$ echo a1; echo a2 | grep -o a
a1
a
Aqui ambos os ecos o fazem.
$ { echo a1; echo a2 ;} | grep -o a
a
a
Aqui também.
$ (echo a1; echo a2 )| grep -o a
a
a
Então, qual é a diferença entre () e {}?
Os parênteses redondos introduzem um subshell.
Lembre-se, isso
$$
permanece o mesmo no subshell porque o bash não precisa ser reinicializado.$BASHPID
mudanças, no entanto.