bashのパイプ内外で使用する変数について

bashシェルスクリプトを書くとき、パイプ"|"を使ってwhileのループの処理を行う場合、ループ内の変数をループ外に引き継げない。

例:

seq 10 > seq10file
cat seq10file
1
2
3
4
5
6
7
8
9
10

このファイルに対して

>vim test.sh
#!/bin/bash
ln=1
cat seq10file | while read f
do
    echo "$ln"
    let ln=ln+1
done
echo "-------"
echo "$ln"
>chmod +x test.sh

を実行する。whileループ内ではlnがインクリメントされるのでループ脱出後の変数lnは11になると思ったら

>./test.sh 
1
2
3
4
5
6
7
8
9
10
-------
1

1のままである。調べて見るとパイプを使用すると別プロセスが生成されるため、パイプ内のwhileループのプロセスで完結し、変数が引き継がれないためらしい。

つまり、パイプ内外で変数を共有するにはファイルを介するしかないんですかね。

#!/bin/bash
ln=1
cat seq10file | while read f 
do
    echo "$ln"
    let ln=ln+1
    echo "$ln" >tmp_$$
done
ln=`cat tmp_$$`
echo "-----"
echo "$ln"
rm tmp_$$

>./test.sh
1
2
3
4
5
6
7
8
9
10
-----
11

意図通りになったけどちょっとダサい。

それでは、別のshellではどうだろうか。

#!/bin/zsh
ln=1
cat seq10file | while read f
do
	echo "$ln"
	let ln=ln+1
done
echo "-------"
echo "$ln"

> ./test.sh 
1
2
3
4
5
6
7
8
9
10
-------
11

おやうまくいった。