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

Aly*_*Aly 3 bash redirect pipe subshell

我写了以下代码

var=0
cat $file | while read line do
    var=$line
done
echo $var
Run Code Online (Sandbox Code Playgroud)

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

然而,这将解决它:

var=0
while read line do
    var=$line
done < $file
echo $line
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Dav*_* W. 13

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

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

不用说,第二种方式更有效率.在旧的Usenet日子之前,所有的小鞭子都抓住了我们的互联网(_Hey you kids!离开我的互联网!)并用你的花哨的图形和所有网页摧毁它,有些人用来给出无用的东西对于为comp.unix.shell小组做出贡献的人而言,他获得了Cat奖励,cat因为使用cat它几乎从来没有必要,而且效率通常更低.

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

  • @Aly:`while`循环不在'current`过程中!它位于`cat`命令创建的子shell中.因此,退出`while`循环,退出`cat`子流程并重新进入常规流程. (2认同)