循环 - 进程替换与此处字符串与命令替换

时间:2013-08-24 21:01:39

标签: bash while-loop

有人可以解释这两个while循环之间的区别:

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

-

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

2 个答案:

答案 0 :(得分:7)

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

执行seq 5,将结果收集到临时变量中。然后执行while循环,将收集结果输入。

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

设置子shell以执行seq 5并将其stdout连接到stdin。然后启动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,差异会更加明显。 <<<"$(...)表单将使用更多内存来存储临时字符串。

答案 1 :(得分:3)

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

如果你做echo <(:),你会发现过程替换的概念与其他字符串输入的区别。

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