2009-02-20 23 views

回答

41
echo "hey hey, we're the monkees" | tee /dev/tty | gzip --stdout > my_log.gz 

正如在評論中指出,/dev/stdout威力在某些情況下比/dev/tty工作更好。

+0

_A_w_e_s_o_m_e_。謝謝。 – 2009-02-20 19:54:29

+3

在那裏做什麼/ dev/tty?原始問題需要標準輸出的輸出,而不是終端上的輸出。 – 2009-02-20 20:29:46

+4

/dev/tty是當前終端的同義詞。提問者以習慣的方式使用「標準輸出」來表示當前的終端,而不是對該術語的更嚴格的定義。 – 2009-02-20 20:41:57

16

祝你有個不錯的杯子tee

tee命令拷貝標準輸入 到標準輸出並且也作爲參數給出任何 文件。這是 有用的,當你想不只是送 某些數據中,一個管道,還要 保存副本

正如我有一個緩慢的下午,這裏的有些誇張說明ASCII藝術...

  +-----+     +---+     +-----+ 
stdin -> |cmd 1| -> stdout -> |tee| -> stdout -> |cmd 2| 
      +-----+     +---+     +-----+ 
             | 
             v 
            file 

由於greyfade在另一個答案體現了「文件」不一定是一個普通的文件,但可能是FIFO讓你管那個tee'd輸出到第三命令。

  +-----+     +---+     +-----+ 
stdin -> |cmd 1| -> stdout -> |tee| -> stdout -> |cmd 2| 
      +-----+     +---+     +-----+ 
             | 
             v 
            FIFO 
             | 
             v 
            +-----+ 
            |cmd 3| 
            +-----+ 
46

另一種方法(假設像bashzsh殼):

echo "hey hey, we're the monkees" | tee >(gzip --stdout > my_log.gz) 

誠然奇怪>()語法基本上具有下列功能:

  • 創建新的FIFO(通常是一些在/tmp/
  • ()和b中執行命令將FIFO指定給該子命令上的stdin
  • 將FIFO文件名返回給命令行。

什麼tee最終看到的話,是這樣的:

tee /tmp/arjhaiX4 

所有gzip看到的是它的標準輸入。

對於Bash,詳見man bash。它在redirection的部分。對於Zsh,請參閱man zshexpn,標題爲「過程替代」。據我所知,Korn Shell,經典的Bourne Shell(包括灰和破折號)和C Shell的變體不支持這種語法。

6

剛剛發佈的方式,不涉及接觸磁盤:

echo "hey hey, we're the monkees" | (exec 1>&3 && tee /proc/self/fd/3 | gzip --stdout > my_log.gz) 
相關問題