【问题标题】:What happens when reading into a variable in a pipeline?读入管道中的变量时会发生什么?
【发布时间】:2018-04-07 09:32:17
【问题描述】:
echo hello | read str
echo $str
这个read 在管道之后执行,这意味着echo 的输出被读入str - 但因为它在管道之后,str 的内容现在位于一个子shell 中父 shell 无法读取。
str 的内容会发生什么变化?管道是否创建了一个子shell,然后一旦将内容读入str,父进程是否会杀死子进程并删除str - 或者str 的内容是否存在于shell 之外的某个地方?就像我们如何看到子外壳中的内容?我们可以从父 shell 访问子 shell 吗?
【问题讨论】:
标签:
bash
pipeline
subshell
【解决方案1】:
${str} 的值只存在于子shell 的生命周期中。管道的左边还是右边是父shell还是子shell取决于具体的shell和shell版本。
Bash 4.x 有一个选项 shopt -s lastpipe 可以在父 shell 中运行管道的最后一个命令,就像 ksh93 默认情况下那样。然后$str 的值将保持不变。
【解决方案2】:
在您的示例中,$str 存在于子shell 中,默认情况下,一旦行完成,它就会消失。子进程不能修改其父进程。
除了更改 shell 选项lastpipe,您还可以更改代码以避免使用管道。在这种情况下,您可以使用:
read str < <(your command)
# or
str=$(your command)
这两个也创建子shell,但$str被分配到父进程中。