是否有人可以解释这两个while循环的区别:While循环 - 进程替换与此字符串命令替换
while read test; do
echo $test
done <<< "$(seq 5)"
-
while read test; do
echo $test
done < <(seq 5)
是否有人可以解释这两个while循环的区别: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或另一个二进制文件,然后它会像管道一样发送给它。有时在Cygwin中不可能使用process substitution
的环境中,here documents
或here strings
以及command substitutions
更有帮助。
如果你这样做echo <(:)
你看到在其他字符串输入的过程替换概念的区别。
进程替代更多的是表示一个文件,而在这里字符串更多的是在缓冲区中发送输入。
你有没有看过'man bash'? – paxdiablo