【问题标题】:why does redirect (<) not create a subshell为什么重定向(<)不创建子shell
【发布时间】:2011-06-27 20:56:30
【问题描述】:

我写了以下代码

var=0
cat $file | while read line do
    var=$line
done
echo $var

现在据我了解,管道 (|) 将导致创建子 shell,因此第 1 行的变量 var 将在最后一行具有相同的值。

但是这会解决它:

var=0
while read line do
    var=$line
done < $file
echo $line

我的问题是为什么重定向不会导致创建子shell,或者如果您喜欢为什么管道会导致创建子shell?

谢谢

【问题讨论】:

    标签: bash redirect pipe subshell


    【解决方案1】:

    cat 命令是一个命令,这意味着它需要自己的进程并且有自己的 STDIN 和 STDOUT。您基本上是在使用 cat 命令生成的 STDOUT 并将其重定向到 while 循环的过程中。

    当您使用重定向时,您并未使用单独的进程。相反,您只是将 while 循环的 STDIN 从控制台重定向到文件的行。

    不用说,第二种方式效率更高。在旧的Usenet 前几天,在你们所有的小鞭笞者获得我们的互联网(_嘿,孩子们!离开我的互联网!)并用你们精美的图形和所有网页摧毁它之前,有些人用来发布Useless Use of Cat 奖励为 comp.unix.shell 组做出贡献并使用虚假的 cat 命令的人,因为使用 cat 几乎没有必要,而且通常效率更低。 p>

    如果您在代码中使用cat,您可能不需要它。 cat 命令来自 concatenate 并且假设仅用于将文件连接在一起。例如,当我们过去在 800K 软盘上使用 SneakerNet 时,我们必须使用 Unix 的 split 命令拆分长文件,然后使用 cat 将它们合并在一起。

    【讨论】:

    • 您好,感谢您的回复(+ 历史课 :))。我知道 cat 命令需要的是自己的进程,但是它将其标准输出重定向到 while 循环进程的标准输入,变量 var 在 while 循环的过程中退出,所以我的问题是当 while 循环更改值时变量为什么不持久?希望这是有道理的(如果你能回答这个问题,我很乐意接受你的回答,无论哪种方式 +1 历史课)
    • @Aly:while 循环不在current 进程中!它位于cat 命令创建的子shell 中。因此,退出while 循环,退出cat 子进程并重新进入常规进程。
    【解决方案2】:

    有一个管道将一个程序的标准输出连接到标准输入或另一个程序。两个进程,可能是两个 shell。当您进行重定向(&gt;&lt;)时,您所做的只是将标准输入(或标准输出)重新映射到文件。无需其他进程或外壳即可读取/写入文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-30
      • 2021-03-13
      • 2018-12-12
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      相关资源
      最近更新 更多