为什么重定向(<)不会创建子shell

时间:2011-06-27 20:56:31

标签: bash redirect pipe subshell

我写了以下代码

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?

由于

2 个答案:

答案 0 :(得分:12)

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

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

毋庸置疑,第二种方式更有效率。在你们所有人之前的Usenet天,我们的互联网上都有很少的鞭钉者(_Hey you kids!离开我的互联网!)并用你的花哨图形和所有网页摧毁它,有些人用来给为 comp.unix.shell 组贡献的人员颁发Useless Use of Cat奖项并获得虚假cat命令,因为几乎不需要使用cat而且效率通常更低。

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

答案 1 :(得分:2)

管道将一个程序的stdout挂钩到stdin或另一个程序。两个进程,可能是两个shell。当您进行重定向(><)时,您正在将stdin(或stdout)重新映射到文件。读取/写入文件可以在没有其他进程或shell的情况下完成。

相关问题