2013-05-22 99 views
6

我有時想輸出中間管道的內容(難道我們都不?)。使用tee的奇怪:任何人都可以解釋嗎?

我一般做這樣的(是的,我知道有其他的,可能會更好,方式):

terminal=$(tty) 
echo hello world |tee $terminal|awk '{print $2, $1}' 

其輸出

hello world 
world hello 

這很好,並在各方面都可愛。

除了我會真的喜歡做,而不創建$終端變量。 容易,你說,只是「tee $(tty)」取代「tee $terminal」在管,而無需一個變量?對?

錯誤。

echo hello world |tee $(tty)|awk '{print $2, $1}' 

輸出

world hello 

換句話說,從管的中間我的輸出已被吞下。

現在我接受,這絕對是一個第一世界的問題,但它讓我很煩,我想知道爲什麼第二個解決方案是行不通的。

有人嗎?

+0

+1爲「第一世界的問題」,並很好的問題。 – tripleee

回答

7

如果您的系統支持的話,您可以直接與/dev/tty訪問當前終端:

echo hello world | tee /dev/tty | awk '{print $2, $1}' 

(該文件是在Linux和Mac OS X可在任何速度。)

tty命令返回連接到標準輸入的文件的名稱,該標準輸入可能不一定是終端。在你的管道中,它是與前面命令的標準輸出相關聯的「文件」。

+0

經測試並在raspbian,netbsd,CentOS上運行;所以它應該對大多數用途都有好處。 – demure

+0

Ah.yes。這是完全合理的。我應該知道的。(o // O)。 (根據維基百科這是一個尷尬的表情)。謝謝。 – hardcode57

+0

哈!如果我做了一個快速的'ls',我就可以進入: – hardcode57

1

您還可以使用tee與進程替換如果您的系統支持:

echo hello world | tee >(awk '{print $2, $1}') 

線有時來得太遲,所以你可能需要在結束時,如果需要增加; sleep .01

或者你也可以使用標準的錯誤報告:

echo hello world | tee >(cat >&2) | awk '{print $2, $1}' 
相關問題