管道之后无法在源代码脚本中更改bash变量?

时间:2017-03-02 18:00:54

标签: linux bash shell

我构建了一个简单的例子来说明问题:

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

问题:如何在$state中保留/检索caller.sh的更改值?

1 个答案:

答案 0 :(得分:3)

您不能使用烟斗。 source命令在管道完成后退出的子shell中运行,因此永远不会在调用state的shell中设置echo "$state"。您可以使用流程替换来“反转”管道:

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

现在source在同一个shell中执行。