我遇到了一个挑战,变量值在 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”时,解释脚本的 shell 正在为循环分叉一个新的 shell。在循环中插入睡眠并在后台启动脚本会给出以下进程列表:
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
正如您所看到的,列表末尾有一个额外的 shell。您可以使用此脚本获得相同的结果:
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"
但没有你提到的副作用。