开发者

why does redirect (<) not create a subshell

开发者 https://www.devze.com 2023-03-16 05:03 出处:网络
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 li

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


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.


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号