bash - pipe创建一个子shell

时间:2017-10-26 06:03:57

标签: bash subshell

所以这个读取是在管道之后执行的,这意味着echo的输出被读入 str - 但是因为它是在管道之后, str 现在位于父shell无法读取的子shell中。 我的问题是 - str 的内容会发生什么?管道是否创建子shell,然后一旦内容被读入 str ,父进程是否会终止子进程并且 str 被删除 - 或者<内容< em> str 生活在shell之外的某个地方。就像我们如何看待子壳中的内容一样?我们可以从父shell访问子shell吗?

echo hello | read str
echo $str

2 个答案:

答案 0 :(得分:7)

${str}的值仅在子shell的生命周期内存在。

Bash 4.x有一个选项shopt -s lastpipe来运行父shell中管道的最后一个命令,就像默认情况下ksh93一样。 $str的值将持续存在。

答案 1 :(得分:4)

在您的示例中,$str存在于子shell中,默认情况下,一旦该行完成,它就会消失。子进程无法修改其父进程。

除了更改shell选项lastpipe之外,您还可以更改代码以避免使用管道。在这种情况下,您可以使用:

read str < <(your command) 
# or
str=$(your command)

这两个都创建了子shell,但在父进程中分配了$str