使用“tee”时更改函数内的全局变量?

时间:2013-07-17 08:35:38

标签: bash shell

我想更改全局变量的值。 当我正常执行该功能时,它工作正常。 但是,当我用发球台执行它时,情况并非如此。 我需要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.

2 个答案:

答案 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时则不行。

如果您发布实际代码,我们可能会帮助您为特定代码段设计解决方案。