2009-08-19 216 views
11

a post's答案上superuser.com,我们看到<()在Bash中做什么?

join <(sort abc) <(sort bcd) 

会向他们发送加入之前对文件进行排序ABC和BCD。这导致了一个编程问题,更适合于stackoverflow。

这是如何工作的?这个<()结构究竟是什么?它叫什么?

如果(排序abc)是一个合法调用,它对abc进行排序并返回输出,为什么我们需要<

即,下面的两行是等效

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

join (sort abc) (sort bcd) 

是语法错误。请告诉我!

+1

阅读shell的精美手册的优良传统成为了什么? – Jens 2012-05-12 17:01:38

回答

21

这被称为过程替代。

<(list)是一个单一的语法构建体中,“<”字符不是在这种情况下一个单独的符号。它执行列表,并将其输出作为文件(不是标准重定向)的排序提供给该命令。

这相当于运行(除非它使用管道而不是临时文件如果可能):

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

注意的是,提供这两类的输出文件名的加入,而不是标准重定向。

(list)是一个不同的构建体,用于不同的目的。它只是创建一个子shell,它执行列表,向父shell提供标准描述符。

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

5

<(command)进程替换(参见man bash的根据部分)。基本上命令运行,并且其输出被馈送到一个命名管道(FIFO),然后整个构建体替换为管道的名称,因此导致join /dev/fd/x /dev/fd/y