【问题标题】:What does <() do in Bash?<() 在 Bash 中做了什么?
【发布时间】:2010-11-20 22:42:24
【问题描述】:

在 superuser.com 上的a post's 回答中,我们看到了

join <(sort abc) <(sort bcd)

在将文件 abc 和 bcd 发送到加入之前对其进行排序。这就引出了一个编程问题,更适合 stackoverflow。

这是如何工作的?这个

如果 (sort abc) 是在 abc 上运行 sort 并返回输出的合法调用,为什么我们需要 &lt;

即下面两行是等价的

(sort abc) | join - <(sort bcd)
join <(sort abc) <(sort bcd)

但是

join (sort abc) (sort bcd)

是语法错误。请给我提示!

【问题讨论】:

  • 阅读精美的外壳手册的古老传统已经变成了什么?

标签: linux bash shell redirect subprocess


【解决方案1】:

这称为进程替换。

&lt;(list) 是一个单一的语法结构,在这种情况下,'list 并将其输出作为一种文件(不是标准重定向)提供给命令。

相当于运行(除了尽可能使用管道而不是临时文件):

sort abc > /tmp/1
sort bcd > /tmp/2
join /tmp/1 /tmp/2

请注意,两种类型的输出都作为要加入的文件名提供,而不是作为标准重定向。

(list) 是不同的构造,用于不同的目的。它只是创建一个执行 list 的子 shell,将其标准描述符提供给父 shell。

Here 是 bash 手册中的相关部分。

【讨论】:

    【解决方案2】:

    &lt;(command) 是一个进程替换(参见man bash 中的相应部分)。基本上 command 运行并将其输出馈送到命名管道(FIFO),然后整个构造被管道名称替换,从而导致join /dev/fd/x  /dev/fd/y.

    【讨论】:

      猜你喜欢
      • 2020-10-03
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      相关资源
      最近更新 更多