2017-03-02 24 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指向日志文件 –