有人能否解释一下这两个 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或另一个二进制文件,则会像管道一样将其发送到该进程。在无法使用“进程替换”(如Cygwin中),“此处文档”或“此处字符串”以及“命令替换”等环境中,有时更有帮助。echo <(:)
,则可以看到过程替代与其他字符串输入在概念上的区别。echo <(:)
会以 /dev/fd/<number>
的形式打印文件吗? :
是一个特殊字符吗? - jmrah:
字符是true
命令的别名,似乎是展示进程替换最简洁的方式。有关:
的更多信息,请参见此SO答案:https://dev59.com/unA75IYBdhLWcg3wkZ6A#3224910 - jmrah
man bash
吗? - paxdiablo