为什么重定向(<)不创建子shell
我编写了以下代码
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?
谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
cat
命令是一个命令,这意味着它需要自己的进程,并且有自己的 STDIN 和 STDOUT。您基本上是获取由cat
命令生成的 STDOUT 并将其重定向到 while 循环的进程中。当您使用重定向时,您没有使用单独的进程。相反,您只是将 while 循环的 STDIN 从控制台重定向到文件的行。
不用说,第二种方式效率更高。在过去的 Usenet 时代,在你们这些小自吹自擂者掌握了我们的互联网之前(_嘿,你们这些孩子!滚出我的互联网!)并用你精美的图形和所有网页毁掉了它,有些人用它来发出猫的无用使用 奖励那些为该项目做出贡献的人comp.unix.shell 组并有一个虚假的
cat
命令,因为几乎不需要使用cat
并且通常效率较低。如果您在代码中使用
cat
,则可能不需要它。cat
命令来自 concatenate,仅用于将文件连接在一起。例如,当我们在 800K 软盘上使用 SneakerNet 时,我们必须使用 Unix split 命令,然后使用cat
将它们合并在一起。The
cat
command is a command which means it needs its own process and has its own STDIN and STDOUT. You're basically taking the STDOUT produced by thecat
command and redirecting it into the process of the while loop.When you use redirection, you're not using a separate process. Instead, you're merely redirecting the STDIN of the while loop from the console to the lines of the file.
Needless to say, the second way is more efficient. In the old Usenet days before all of you little whippersnappers got ahold of our Internet (_Hey you kids! Get off of my Internet!) and destroyed it with your fancy graphics and all them web page, some people use to give out the Useless Use of Cat award for people who contributed to the comp.unix.shell group and had a spurious
cat
command because the use ofcat
is almost never necessary and is usually more inefficient.If you're using a
cat
in your code, you probably don't need it. Thecat
command comes from concatenate and is suppose to be used only to concatenate files together. For example, when we use to use SneakerNet on 800K floppies, we would have to split up long files with the Unix split command and then usecat
to merge them back together.管道用于将一个程序的标准输出连接到标准输入或另一个程序。两个进程,可能是两个 shell。当您进行重定向(
>
和<
)时,您所做的就是将 stdin(或 stdout)重新映射到文件。无需其他进程或 shell 即可完成读/写文件。A pipe is there to hook the stdout of one program to the stdin or another one. Two processes, possibly two shells. When you do redirection (
>
and<
), all you're doing remapping stdin (or stdout) to a file. reading/writing a file can be done without another process or shell.