避免使用子 shell

进程替换的一个主要方面是它允许我们在从 shell 处理命令时避免使用子 shell。

这可以通过下面的简单示例来证明。我当前文件夹中有以下文件:

$ find . -maxdepth 1 -type f -print
foo bar zoo foobar foozoo barzoo 

如果我管道到 while / read 循环,增加一个计数器如下:

count=0
find . -maxdepth 1 -type f -print | while IFS= read -r _; do
    ((count++))
done

$count 现在确实包含 6,因为它是在子外壳上下文修改。下面显示的任何命令都在子 shell 上下文中运行,并且在子 shell 终止后,其中使用的变量的范围将丢失。

command &
command | command 
( command )

流程替换将通过避免使用管道|运算符来解决问题

count=0
while IFS= read -r _; do
    ((count++))
done < <(find . -maxdepth 1 -type f -print)

这将保留 count 变量值,因为没有调用子 shell。