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"
しかし、言われた副作用はありません。