有人可以解释一下这两个while循环之间的区别:
while read test; do
echo $test
done <<< "$(seq 5)"
-
while read test; do
echo $test
done < <(seq 5)
有人可以解释一下这两个while循环之间的区别:
while read test; do
echo $test
done <<< "$(seq 5)"
-
while read test; do
echo $test
done < <(seq 5)
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
,差异会更明显。该<<<"$(...)
表单将使用更多内存来存储临时字符串。
根据我的理解,唯一的区别是进程替换将表示一个命名管道,例如/dev/fd/63
作为输入文件,而<<< ""
在内部发送输入,就像读取缓冲区一样。当然,读取输入的命令是在另一个进程上,比如子shell或另一个二进制文件,然后它会像管道一样被发送给它。有时在process substitution
Cygwin 等不可能的环境中,here documents
或者更有用here strings
。command substitutions
如果您确实echo <(:)
看到了进程替换与其他字符串输入的概念差异。
进程替换更多的是代表一个文件,而这里的字符串更多的是在缓冲区中发送以供输入。