2017-03-02 48 views
2

我構建了一個簡單的例子來說明這個問題:管道後不能得到源腳本中的bash變量?

caller.sh

#!/usr/bin/env bash 
state="loaded" 
source "sh/callee.sh" 2>&1 
echo "$state" 

callee.sh

#!/usr/bin/env bash 
state="integrated" 

當我運行caller.sh,它給了我想要的結果:

integrated 

但是,如果我的源命令後添加一個管:

caller.sh

#!/usr/bin/env bash 
state="loaded" 
source "sh/callee.sh" 2>&1 | cat 
echo "$state" 

結果變成:

loaded 

問:我如何保存/恢復的更改值$statecaller.sh

+0

管道分叉一個子外殼,一旦子外殼終止,該值就會丟失 – Inian

+1

您首先使用'cat'的意圖是什麼? – Inian

回答

3

您不能使用管道。 source命令在管道完成後退出的子shell中運行,因此從未在調用echo "$state"的shell中設置state。您可以使用進程替換爲「反轉」管道:

state="loaded" 
source "sh/callee.sh" 2>&1 > >(cat) 
echo "$state" 

現在source執行相同的外殼。

+0

爲什麼在這裏需要'貓'? – Inian

+0

第一個'>'做什麼? –

+0

'cat'就是我在這個例子中想到的。在我的程序中,我想將stdin和stderr指向日誌文件 –