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

发布于 2024-11-17 13:20:21 字数 355 浏览 1 评论 0 原文

我编写了以下代码

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?

谢谢

I wrote the following code

var=0
cat $file | while read line do
    var=$line
done
echo $var

Now as I understand it the pipe (|) will cause a sub shell to be created an therefore the variable var on line 1 will have the same value on the last line.

However this will solve it:

var=0
while read line do
    var=$line
done < $file
echo $line

My question is why does the redirect not cause a subshell to be created, or if you like why does pipe cause one to be created?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

逆光下的微笑 2024-11-24 13:20:21

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 the cat 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 of cat is almost never necessary and is usually more inefficient.

If you're using a cat in your code, you probably don't need it. The cat 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 use cat to merge them back together.

那伤。 2024-11-24 13:20:21

管道用于将一个程序的标准输出连接到标准输入或另一个程序。两个进程,可能是两个 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文