有人可以解释这两个while循环之间的区别:
while read test; do
echo $test
done <<< "$(seq 5)"
-
while read test; do
echo $test
done < <(seq 5)
答案 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 documents
或here strings
以及command substitutions
会更有帮助。
如果你做echo <(:)
,你会发现过程替换的概念与其他字符串输入的区别。
进程替换更多地是表示文件,而这里的字符串更多是在缓冲区中发送以进行输入。