我在Bash脚本中偶然发现了一些奇怪的Heredoc用法。一个简化的例子是这样的:
do_stuff() {
notify @<(cat <<- EOF
{
"key": "value",
<more JSON data>
}
EOF
)
}
该@<(cat <<- EOF
零件做什么?与常规的Heredoc有何不同?
<(...)
是一个过程替代。Bash在某个目录中创建一个fifo,然后在其中运行命令,<(...)
并用fifo名称替换该表达式。进程替换具有(奇怪的)生存期规则,但是它们通常一直有效到命令或行结束。例如:
$ cmd=<(echo 123); echo cmd=$cmd; cat $cmd
cmd=/dev/fd/63
123
<<-EOF
是这里的文件。如果-
在分隔符的前面,则将忽略包括分隔符的行在内的后续行上的前导选项卡。(注意:stackoverflow不会保留选项卡)。
$ echo -e '
cat <<EOF
\tblabla
EOF
cat <<-EOF
\t\t\t\t\tblabla
\t\t\t\t\t\t\t\t\t\t\t\t\tEOF
' > file.sh
$ bash ./file.sh
blabla
blabla
notify @<(...)
只是用<(...)
内部的部分代替/dev/fd/<number>
并执行notify @/dev/fd/<number>
。可能@
用于notify
处理以指示它应该从文件读取,而其余参数是文件名。然后cat
,将输出绑定到/dev/fd/<number>
通过流程替换创建的fifo的流程,cat
流程将{ <more json data> }
在标准输入中接收此处文档的内容。cat
输出标准输入到输出,然后我猜notify
读取fifo并接收字符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句