2013-08-24 154 views

回答

6
while read test; do 
    echo $test 
done <<< "$(seq 5)" 

执行seq 5,将结果收集到一个临时变量中。然后执行while循环,为其提供收集结果。

while read test; do 
    echo $test 
done < <(seq 5) 

建立一个子shell执行seq 5并连接其stdoutstdin。然后启动while循环。完成后,还原stdin

有什么区别?对于seq 5,几乎没有什么;但是,仍然可以通过将seq 5更改为seq 5; echo done generating sequence >&2来使其可见。然后可以看到,在第一种情况下,整个seq执行在while循环开始之前完成,而在第二种情况下它们并行执行。

$ while read n; do echo $n > /dev/stderr; done \ 
>  <<<"$(seq 5; echo done generating sequence >&2)" 
done generating sequence 
1 
2 
3 
4 
5 
$ while read n; do echo $n > /dev/stderr; done \ 
>  < <(seq 5; echo done generating sequence >&2) 
1 
2 
done generating sequence 
3 
4 
5 

如果是seq 10000000,差异将更加清晰。 <<<"$(...)窗体将使用更多的内存来存储临时字符串。

2

基于我认为,唯一的不同之处在于流程替换会代表一个命名管道,例如/dev/fd/63作为输入文件,而<<< ""将在内部发送输入,就像读取缓冲区一样。当然,读取输入的命令是在另一个进程上,如一个子shell或另一个二进制文件,然后它会像管道一样发送给它。有时在Cygwin中不可能使用process substitution的环境中,here documentshere strings以及command substitutions更有帮助。

如果你这样做echo <(:)你看到在其他字符串输入的过程替换概念的区别。

进程替代更多的是表示一个文件,而在这里字符串更多的是在缓冲区中发送输入。