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

HTF*_*HTF 6 bash while-loop

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

while read test; do
echo $test
done <<< "$(seq 5)"
Run Code Online (Sandbox Code Playgroud)

-

while read test; do
echo $test
done < <(seq 5)
Run Code Online (Sandbox Code Playgroud)

ric*_*ici 8

while read test; do
  echo $test
done <<< "$(seq 5)"
Run Code Online (Sandbox Code Playgroud)

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

while read test; do
  echo $test
done < <(seq 5)
Run Code Online (Sandbox Code Playgroud)

设置子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
Run Code Online (Sandbox Code Playgroud)

如果是的话seq 10000000,差异会更加明显.该<<<"$(...)表格会以存储临时字符串中使用了大量的内存.