避免使用子 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。