【问题标题】:What does @<(cat <<- EOF do in Bash?@<(cat <<- EOF 在 Bash 中做了什么?
【发布时间】:2020-10-03 07:57:32
【问题描述】:

我在 Bash 脚本中偶然发现了一些奇怪的 heredoc 用法。一个简化的例子是这样的:

do_stuff() {
      notify @<(cat <<- EOF
  {
      "key": "value",
       <more JSON data>
  }
  EOF
               )
  }

@&lt;(cat &lt;&lt;- EOF 部分有什么作用?它与普通的heredoc有什么不同?

【问题讨论】:

  • &lt;&lt;- EOF ... EOF 是一个heredoc,一种将多行字符串(由省略号表示)作为stdin 传递给一个命令的方法,在本例中为cat&lt;(command) 扩展为一个文件名,您可以从中读取command 的输出。因此,do_stuff 的行为就像您使用 JSON 文本创建了一个文件(我们称之为 input.json)并称为 notify @input.json

标签: bash io-redirection heredoc process-substitution


【解决方案1】:

&lt;(...) 是一个process substitution。 Bash 在某个目录中创建一个 fifo 并在 &lt;(...) 中运行命令并将表达式替换为 fifo 名称。进程替换具有(奇怪的)生命周期规则,但它们通常在命令或行结束之前有效。例如:

$ cmd=<(echo 123); echo cmd=$cmd; cat $cmd
cmd=/dev/fd/63
123

&lt;&lt;-EOFhere document。如果在 delimeter 前面有 -,则后面几行的前导制表符(包括带有 delimeter 的行)将被忽略。 (注意: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 @&lt;(...) 只是将内部的&lt;(...) 部分替换为一些/dev/fd/&lt;number&gt; 并执行notify @/dev/fd/&lt;number&gt;@ 可能用于notify 进程以指示它应该从文件中读取,其余参数是文件名。然后cat 进程将输出绑定到使用进程替换创建的/dev/fd/&lt;number&gt; fifo,cat 进程在标准输入上接收此处的文档内容{ &lt;more json data&gt; }cat 将标准输入输出到输出,然后我猜notify 读取 fifo 并接收字符。

【讨论】:

    猜你喜欢
    • 2010-11-20
    • 2011-01-30
    • 2014-12-16
    • 2012-08-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    相关资源
    最近更新 更多