@<(cat <<- EOF 在 Bash 中做什么?
What does @<(cat <<- EOF do in Bash?
我在 Bash 脚本中偶然发现了一些奇怪的 heredoc 用法。一个简化的例子是这样的:
do_stuff() {
notify @<(cat <<- EOF
{
"key": "value",
<more JSON data>
}
EOF
)
}
@<(cat <<- EOF
部分有什么作用?它与常规的 heredoc 有何不同?
<(...)
是一个 process substitution。 Bash 在某个目录中创建一个 fifo,运行 在 <(...)
中创建命令,并将表达式替换为 fifo 名称。进程替换有(奇怪的)生命周期规则,但它们通常在命令或行结束之前有效。例如:
$ cmd=<(echo 123); echo cmd=$cmd; cat $cmd
cmd=/dev/fd/63
123
<<-EOF
是一个 here document。如果 delimeter 前面有 -
,则忽略后续行的前导制表符,包括带有 delimeter 的行。 (注意:Whosebug 不保留制表符)。
$ 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并接收字符。
我在 Bash 脚本中偶然发现了一些奇怪的 heredoc 用法。一个简化的例子是这样的:
do_stuff() {
notify @<(cat <<- EOF
{
"key": "value",
<more JSON data>
}
EOF
)
}
@<(cat <<- EOF
部分有什么作用?它与常规的 heredoc 有何不同?
<(...)
是一个 process substitution。 Bash 在某个目录中创建一个 fifo,运行 在 <(...)
中创建命令,并将表达式替换为 fifo 名称。进程替换有(奇怪的)生命周期规则,但它们通常在命令或行结束之前有效。例如:
$ cmd=<(echo 123); echo cmd=$cmd; cat $cmd
cmd=/dev/fd/63
123
<<-EOF
是一个 here document。如果 delimeter 前面有 -
,则忽略后续行的前导制表符,包括带有 delimeter 的行。 (注意:Whosebug 不保留制表符)。
$ 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并接收字符。