所以,我希望将 的输出unzip -Z1
放入数组中并找到了这个答案;他们的第一个选择,使用mapfile
输入重定向并处理替换,很有魅力。
但后来我想,“等等,进程替换”,它从标准输出创建一个文件描述符,“然后使用输入重定向将内容放入标准输入?”
这不等同于管道吗?
显然没有。不,不是。在这里,我尝试将 的内容ls
放入变量中,但使用的是管道:à la ls | mapfile -t test
Nada。
但是,如果我按照 T 的答案:id est mapfile -t test < <(ls)
Voilà。
除了创建文件描述符外,我找不到任何内在的特殊之处。< <()
以此为理论,我尝试了 HEREDOC,它也制作了一个文件描述符。有效:
mapfile -t test2 << END && printf '%s ' "${test2[@]}"
this
is
an
array
END
但如果它是通过stdin
via清洗的cat
,请尝试:
cat << END | mapfile -t test3 && printf '%s ' "${test3[@]}"
this
is
an
array
END
所以,我的问题。
HEREDOC 发现/文件描述符理论应该无关紧要,mapfile
因为它的手册都说它使用“标准输入”,对吗?
如果“标准输入”以某种方式意味着它必须是一个更高级的描述符;为什么?为什么不能使用简单的一次读取输入流来生成数组?
最后,如果这两个都得到了回答/在正确的轨道上,为什么命令在预期 fd 时没有失败?你会看到我的终端0
打印了一堆(我们用&&
在最后一个例子中),那是$?
在我的上prompt
,所以内置没有报告错误。
我在 Fedora 30 和 RHEL 6 上试过这个,所以我不认为这是一个错误。