bashではパイプラインの途中で変数に代入できない?

bashではパイプラインの途中で変数に代入できない?

$ a=1;echo abc | sed s/a/b/ | read a; echo $a; 
1
$ a=1;echo abc | sed s/a/b/ | { read a; echo $a; }
bbc
$ a=1;echo abc | sed s/a/b/ | ( read a; echo $a; )
bbc
$ a=1;a=`echo abc | sed s/a/b/`; echo $a
bbc
$ a=1;echo abc | sed s/a/b/ | { read a; } ;echo $a 
1

バッククオートしか解がないのか?

わけがわからないのは以下

$ a=1 ; { a=2; } ; echo $a
2
$ a=1 ; echo -n 2 | { read a; } ; echo $a
1

readのときだけ挙動が変わるw
変数に代入するリダイレクトが欲しい!

原因はパイプのときforkするから。
http://www.nurs.or.jp/~asada/FAQ/UNIX/section3.8.html

追記 2009/03/12 10:42:10:

bashとzshの標準出力の扱いのちがい - 計算機と戯れる日々にてzshなら解決することが判明