bash - pipe创建一个子shell

cap*_*ser 5 bash subshell

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

echo hello | read str
echo $str
Run Code Online (Sandbox Code Playgroud)

Hen*_*eld 7

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

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


Tom*_*ech 5

在您的示例中,它$str存在于子外壳中,默认情况下,行结束后它就会消失。子进程无法修改其父进程。

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

read str < <(your command) 
# or
str=$(your command)
Run Code Online (Sandbox Code Playgroud)

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