ここでは、2 番目の echo のみが grep にフィードされます。
$ echo a1; echo a2 | grep -o a
a1
a
ここでは両方のエコーがそうします。
$ { echo a1; echo a2 ;} | grep -o a
a
a
ここもそうです。
$ (echo a1; echo a2 )| grep -o a
a
a
では、() と {} の違いは何でしょうか?
答え1
丸括弧はサブシェルを導入します。
$ a=1; { a=2 ; echo $a ; } ; echo $a
2
2
$ a=1; ( a=2 ; echo $a ; ) ; echo $a
2
1
ただし、$$
bash を再初期化する必要がないため、サブシェルでは同じままです$BASHPID
。