我写了以下代码
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?
由于
答案 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的情况下完成。