2009-08-19 76 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