2012-12-04 96 views
2

是什麼什麼是引擎蓋下發生的條件命令管道進入殼層

cat dat | tee >(wc -l) | some other command 

cat dat | tee file | wc -l 

之間的區別? 我可以理解第二個,因爲三通是將流分成一個文件和一個管道。但我對第一個感到困惑。

回答

3

第一符號是擊4.x的(沒有或沒有在3.x的所有版本3的process substitution .x)。

As far作爲tee而言,它給出了它所寫入的文件名(例如/dev/fd/64)以及標準輸出;它實際上是一個管道寫入結束的文件描述符。就wc而言,它讀取其標準輸入(它是連接到,tee的管道的讀取端),並將其答案寫入調用管道的shell的標準輸出(而不是標準輸出tee下降管道)。

+0

謝謝你的回答。如果我可能再問一個問題,過程替換如何與美元符號不同,例如$(command)(我不知道它的名字)在parens前面?例如,var = $(basename文件)可以正常工作,但var =(基本名稱文件)不會。爲什麼這樣? – Alby

+0

'$(command)'替換被稱爲['命令替換'](http://www.gnu.org/software/bash/manual/bash.html#Command-Substitution)。不同之處在於,通常,每個命令替換都會擴展爲程序的多個參數,而每個[進程替換]結果(http://www.gnu.org/software/bash/manual/bash.html#Process-Substitution)結果在該計劃的一個參數。使用一個微弱的例子:'ls $(echo *。*)'生成許多文件名參數,而'ls <(echo *。*)'會給'ls'一個參數(當我試過'ls < *)'它迴應了'/ dev/fd/63'!)。 –

+0

我發現這個參考對理解過程替換非常有幫助:http://tldp.org/LDP/abs/html/process-sub.html – Carl

1

由於>(是的bash過程substitiution, 第一行表示: 發送文件內容「DAT」到一些其他命令 而進程「WC」運行與其輸入或輸出 連接到管道其中還發送的bash的手冊頁的「DAT」

檢查「進程替換」的內容。