10

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

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

-

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

2 回答 2

16
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,差异会更明显。该<<<"$(...)表单将使用更多内存来存储临时字符串。

于 2013-08-25T00:30:30.487 回答
4

根据我的理解,唯一的区别是进程替换将表示一个命名管道,例如/dev/fd/63作为输入文件,而<<< ""在内部发送输入,就像读取缓冲区一样。当然,读取输入的命令是在另一个进程上,比如子shell或另一个二进制文件,然后它会像管道一样被发送给它。有时在process substitutionCygwin 等不可能的环境中,here documents或者更有用here stringscommand substitutions

如果您确实echo <(:)看到了进程替换与其他字符串输入的概念差异。

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

于 2013-08-24T21:06:06.787 回答