2010-03-12 71 views
0

我在玩shell腳本,發生了一件奇怪的事情。我需要有人解釋它。shell腳本問題:在終端上不起作用,但在腳本中起作用

我有一個文件 'INFILE',內容:

line one 
line2 
third line 
last 

測試腳本test.sh,內容:

read var1 
echo $var1 

我執行:

cat infile | ./test.sh 

產量

line one 

然後我做:

cat infile | read var1 
echo $var1 

結果:一個空行。

我甚至嘗試

cat infile | read var1; echo $var1; 

相同的結果。

爲什麼會發生這種情況?

回答

1

管道在它運行在子shell中後會導致命令,這意味着環境變量不會傳播到主shell。使用重定向或herestring來解決這個問題:

read var1 < infile 
0

或者試試這個:

cat file | (read var1; echo $var1;) 
+0

好,我想這一點,而且它也能工作。我該知道爲什麼。 – jrharshath 2010-03-12 19:31:24

+0

它的工作原理是因爲在您的原始示例中,|啓動一個新的子shell,其中設置了var1,但主shell(回顯所在的位置)未「查看」此變量。但在本例中,'read'和'echo'在同一個shell中運行,因此'var1'存在並被打印。 – meowsqueak 2010-11-02 21:07:06