我有代码
# Inside Child.sh
ChildVariable=BigChild
# Inside Parent.sh
source ./Child.sh
echo "ChildVariable=${ChildVariable}"
输出:
ChildVariable=BigChild
但,
# Inside Parent.sh
source ./Child.sh | sed 's/\(.*\)/\t\1/'
echo "ChildVariable=${ChildVariable}"
输出:
ChildVariable=
我需要缩进 的输出(如果有的话),因此Child.sh
,我需要将输出传递给 sed。但是,我不明白为什么ChildVariable
没有设置?
答案1
管道中的每个命令都作为单独的进程执行(即在子 shell 中)。
您正在使用子 shell 获取数据;该变量是在子 shell 中设置的,而不是在运行的 shell 中设置的Parent.sh
。
这将Child.sh
在正确的 shell 中获取:
# Inside Parent.sh
source ./Child.sh > >(sed 's/\(.*\)/\t\1/')
echo "ChildVariable=${ChildVariable}"
sed
尽管现在可能会出现输出后echo
(a的输出竞争条件)。目前我认为解决这个问题的最好方法是重新设计整个程序,这样你就不需要过滤任何源脚本的输出。
您已标记狂欢sosource
和进程替换 ( > >(…)
) 都可以。为了使它可移植,需要使用.
而不是source
和介绍一些 fifo 的技巧。