4

我想更改全局变量的值。当我正常执行该功能时,它工作得很好。但这不是我用发球台执行它的时候。我需要 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.
4

2 回答 2

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.
于 2013-07-17T08:51:44.937 回答
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子shell中执行(因此也是如此),但在重定向标准输入时不执行。cat

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

于 2013-07-17T09:28:57.843 回答