<()在Bash中做了什么?

时间:2009-08-19 12:50:15

标签: linux bash shell redirect subprocess

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

join <(sort abc) <(sort bcd)
在将文件发送到加入之前,

将对文件abc和bcd进行排序。这导致编程问题,更适合stackoverflow。

这是如何工作的?究竟是什么&lt;()构造?它叫什么?

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

即,以下两行是等效的

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

但是

join (sort abc) (sort bcd)

是语法错误。请告诉我!

2 个答案:

答案 0 :(得分:21)

这称为流程替换。

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

它等同于运行(除非它尽可能使用管道而不是临时文件):

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

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

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

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

答案 1 :(得分:5)

<( command )流程替换(请参阅man bash中的相应部分)。基本上运行命令并将其输出提供给命名管道(FIFO),然后整个构造被管道名称替换,从而产生join /dev/fd/ { {1}} x  /dev/fd/