Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 为什么重定向(<;)不创建子shell_Bash_Redirect_Pipe_Subshell - Fatal编程技术网

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

Bash 为什么重定向(<;)不创建子shell,bash,redirect,pipe,subshell,Bash,Redirect,Pipe,Subshell,我编写了以下代码 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 var=0 边读边做 var=$line 完成

我编写了以下代码

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
var=0
边读边做
var=$line
完成<$file
回音$线
我的问题是,为什么重定向不会导致创建子shell,或者如果您喜欢,为什么管道会导致创建子shell


谢谢

有一个管道可以将一个程序的标准输出连接到标准输入或另一个标准输入。两个过程,可能是两个外壳。当您执行重定向(
时,
cat
命令是一个命令,这意味着它需要自己的进程,并且有自己的STDIN和STDOUT。您基本上是将
cat
命令生成的STDOUT重定向到while循环的进程中

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

不用说,第二种方法更有效。在过去,你们这些小捣蛋鬼还没有掌握我们的互联网(“嘿,你们这些孩子!离开我的互联网!)用你的精美图形和所有这些网页破坏了它,一些人用它来奖励那些为comp.unix.shell集团做出贡献并使用了虚假的
cat
命令的人,因为
cat
的使用几乎没有必要,而且通常效率更低


如果您在代码中使用的是
cat
,您可能不需要它。
cat
命令来自concatenate,并且假定它仅用于将文件连接在一起。例如,当我们在800K软盘上使用时,我们必须使用Unix命令拆分长文件,然后使用
cat
将它们合并回到一起。

您好,感谢您的回复(+历史课:)。我得到cat命令需要的是自己的进程,但它将其stdout重定向到while循环进程的stdin,变量var存在于while循环进程中,所以我的问题是,当while循环更改变量的值时,它为什么不持久?希望这是有意义的(如果你能回答这个问题,我会很高兴地接受你的答案,无论哪种方式历史课+1)@Aly:while
循环不在当前的
过程中!它位于由
cat
命令创建的子shell中。因此,当退出
循环时,退出
cat
子进程并重新进入常规进程。