forループのシェル変数の値は、ループの後で異なります。

forループのシェル変数の値は、ループの後で異なります。

forループで変数の値が変更され、forループの後にteeを使用してその変数の値を変更する問題が見つかりました。

SCRIPT_1:

    STATUS=9
    for  SESSION in  A B C
    do
       STATUS=5
       echo "SESSION=$SESSION  STATUS=$STATUS"
    done 
    echo "STATUS=$STATUS"

script_1の出力は次のようになります。

    SESSION=A  STATUS=5
    SESSION=B  STATUS=5
    SESSION=C  STATUS=5
    STATUS=5

SRIPT_2:

    STATUS=9
    for  SESSION in  A B C
    do
       STATUS=5
       echo "SESSION=$SESSION  STATUS=$STATUS"
    done | tee /tmp/ses.txt
    echo "STATUS=$STATUS"

出力_2は次のようになります。

    SESSION=A  STATUS=5
    SESSION=B  STATUS=5
    SESSION=C  STATUS=5
    STATUS=9

コマンドが完了した後にteeを使用すると、出力が異なるのはなぜですか?

答え1

「|tee」と入力すると、スクリプトを解釈するシェルがループの新しいシェルをフォークします。ループにスリープモードを挿入してバックグラウンドでスクリプトを起動すると、次のプロセスのリストが表示されます。

   PID TTY       TIME COMMAND
 21168 pts/0     0:00 sh
 21259 pts/0     0:00 ps
 11962 pts/0     0:00 sh
 21170 pts/0     0:00 sleep
 21171 pts/0     0:00 tee
 21169 pts/0     0:00 sh

ご覧のとおり、リストの末尾に追加のシェルがあります。このスクリプトを使用して同じ結果を得ることができます。

STATUS=9
echo "" > /tmp/ses.txt
for  SESSION in  A B C
do
   STATUS=5
   echo "SESSION=$SESSION  STATUS=$STATUS" | tee -a /tmp/ses.txt
done
echo "STATUS=$STATUS"

しかし、言われた副作用はありません。

関連情報