从这个简单的例子:
$ x="ls output: "
$ ls | while read line; do x="$x $line"; echo $x; done
ls output: a
ls output: a b
ls output: a b c
ls output: a b c d
$ echo $x
ls output:
似乎管道字符启动了一个新的外壳,该外壳确实获得了变量x
的副本,但是在管道的末尾,该值内的x
的值并未复制回到外壳中。
有什么办法可以解决?
注意:我知道有更好/更简单的方法可以完成此特定操作,但这只是一个简化的示例。我的问题是如何在管道后的while循环中获取信息。
禁用作业控制,并且设置了lastpipe
选项;管道的最后一个组件在当前执行环境中运行。参见
$ x=foo
$
$ set +m
$ shopt -s lastpipe
$
$ echo | x=bar
$ echo $x
bar