3

我写了以下代码

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?

谢谢

4

2 回答 2

13

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

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

不用说,第二种方式效率更高。在旧的Usenet时代,在你们所有的小偷窥者掌握了我们的互联网(_嘿,孩子们!离开我的互联网!)并用你们精美的图形和所有网页摧毁它之前,有些人用来发布无用的使用of Cat奖授予为comp.unix.shell组做出贡献并使用虚假cat命令的人,因为使用cat几乎从来没有必要并且通常效率较低。

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

于 2011-06-27T21:18:36.500 回答
2

管道用于将一个程序的标准输出连接到标准输入或另一个程序。两个进程,可能是两个 shell。当您执行重定向 ( >and <) 时,您所做的一切都是将标准输入(或标准输出)重新映射到文件。无需其他进程或外壳即可读取/写入文件。

于 2011-06-27T21:01:54.313 回答