とらりもん - パイプの豆知識(シェルスクリプト) 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
#!/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