とらりもんHOME  Index  Search  Changes  Login

パイプの先は。。。

shとbashを使用している場合、

#!/bin/bash -x
FG=1
echo $FG | while read line
do
FG=0
echo "パイプ内 : FG = $FG" # 実行結果 : FG=0
done
echo "パイプ外 : FG = $FG" # 実行結果 : FG=1

パイプの先は、サブスクリプトとして実行されているため、 上記のような直観とは違う実行結果となる。

下記のようにリダイレクトすれば、直観通りになる。

#!/bin/bash -x
FG=1
echo $FG > /tmp/test.tmp
while read line
do
FG=0
echo "パイプ内 : FG = $FG" # 実行結果 : FG=0
done < /tmp/test.tmp
echo "パイプ外 : FG = $FG" # 実行結果 : FG=0

※ちなみにzshでは、今回の問題は発生しない。Bourne shell特有の問題。

#!/bin/zsh -x
FG=1
echo $FG | while read line
do
FG=0
echo "パイプ内 : FG = $FG" # 実行結果 : FG=0
done
echo "パイプ外 : FG = $FG" # 実行結果 : FG=0

※zshが入っていない場合は、下記でインストール可能。(ubuntu)

sudo apt-get install zsh
Last modified:2014/05/09 15:14:03
Keyword(s):
References: