我想更改全局变量的值。 当我正常执行该功能时,它工作正常。 但是,当我用发球台执行它时,情况并非如此。 我需要tee才能在屏幕和文件上同时输出。
为什么Tee会导致这种行为? 有没有办法用Tee修改函数中的全局变量?
FCT_main()
{
MY_VAR=2
}
MY_VAR=1
echo "MY_VAR=$MY_VAR" # -> print 1.
FCT_main | tee file.out
echo "MY_VAR=$MY_VAR" # -> print 1, but I expect 2 !
echo "\n"
echo "MY_VAR=$MY_VAR" # -> print 1.
FCT_main
echo "MY_VAR=$MY_VAR" # -> print 2 as expected.
答案 0 :(得分:4)
问题不在于tee
。这是管道操作。
管道中的每个命令都在不同的子shell中执行。
因此,不会反映对函数中变量所做的任何更改。
您可以执行以下流程替换,但仍然不等同于管道。
FCT_main > >( tee file.out )
注意:进程替换仅适用于某些shell。发现此代码与bash shell一起使用。
整个代码
FCT_main()
{
MY_VAR=2
}
MY_VAR=1
echo "MY_VAR=$MY_VAR" # -> print 1.
FCT_main > >( tee file.out )
echo "MY_VAR=$MY_VAR" # -> print 1, but I expect 2 !
echo "\n"
echo "MY_VAR=$MY_VAR" # -> print 1.
FCT_main
echo "MY_VAR=$MY_VAR" # -> print 2 as expected.
答案 1 :(得分:0)
以下代码段中出现同样的问题:
i=0
cat $file | while read line; do
i=$(($i + 1))
done
i
在循环结束时为0。
i=0
while read line; do
i=$(($i + 1))
done < $file
实际上会有效。问题是while
在子管中执行(对于那个问题,cat
)在管道中使用时,但在重定向stdin时则不行。
如果您发布实际代码,我们可能会帮助您为特定代码段设计解决方案。