获取 bashscript 后的管道

获取 bashscript 后的管道

我有代码

# 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

man 1 bash

管道中的每个命令都作为单独的进程执行(即在子 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 的技巧

相关内容