【问题标题】: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被分配到父进程中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-20
        • 1970-01-01
        • 1970-01-01
        • 2018-04-08
        • 1970-01-01
        • 2011-11-03
        • 1970-01-01
        相关资源
        最近更新 更多