とらりもんHOME  Index  Search  Changes  Login

とらりもん - パイプの豆知識(シェルスクリプト) Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

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