在管道中读取变量时会发生什么?

13
echo hello | read str
echo $str

这个read命令是在管道之后执行的,这意味着echo输出的内容被读入到str中 - 但由于它在管道后面,str的内容现在在一个子shell中,父shell无法读取。

str的内容会发生什么? 管道是否创建了一个子shell,然后一旦将内容读入str中,父进程就会杀死子进程并擦除str的内容 - 还是str的内容在外部shell中继续存在? 我们如何查看子shell中的内容? 我们可以从父shell访问子shell吗?

2个回答

12

${str} 的值只存在于子shell的生命周期内。左侧或右侧的管道哪一侧是父shell或子shell取决于具体的shell和shell版本。

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


11

在你的例子中,$str 存在于一个子shell中,并且默认情况下,在该行执行完后就消失了。一个子进程不能修改其父进程。

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

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

这两者也会创建子shell,但是$str被分配给父进程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接