2013-07-17 92 views
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

問題不在於tee。這是與管道操作。 管道中的每個命令都在單獨的子殼體中執行。

因此,不會反映對功能中的變量所做的任何更改。

您可以執行以下過程替換,但仍然不等同於管道。

FCT_main > >(tee file.out) 

注意:進程替換隻適用於一些炮彈。這段代碼被發現與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. 
+0

謝謝你的解釋。 我試過你的其他方式,但我得到一個語法錯誤: 'code./test.sh[10]:第10行的語法錯誤:('意外的' – Sephi

+0

@Sephi我已經將整個代碼添加到答案。嘗試複製粘貼它,並執行。 – Antarus

+0

好吧,我明白了,它在Linux上工作正常,但可悲的是我使用SunOS :( – Sephi

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也是如此),但在管道中使用時,不會在重定向stdin時執行。

如果您發佈了實際的代碼,我們可能會幫助您爲特定代碼段設計解決方案。