我构建了一个简单的例子来说明问题:
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
的更改值?
答案 0 :(得分:3)
您不能使用烟斗。 source
命令在管道完成后退出的子shell中运行,因此永远不会在调用state
的shell中设置echo "$state"
。您可以使用流程替换来“反转”管道:
state="loaded"
source "sh/callee.sh" 2>&1 > >(cat)
echo "$state"
现在source
在同一个shell中执行。