2009-02-20 16 views
24

私はコマンドを実行し、そのコマンドの出力にその場でgzipを実行させ、そのコマンドの出力をエコー/ティーアウトします。ファイルに標準入力して標準出力に標準出力するにはどうしたらいいですか?

つまり、何かのように:行が実行される場合を除き

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

、私はこれを標準アウト見たい:

hey hey, we're the monkees 

答えて

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_。ありがとうございました。 –

+3

/dev/ttyは何をしていますか?元の質問は、出力が標準出力にあることを望んでいました。 –

+4

/dev/ttyは、現在の端末の同義語です。質問者は、用語のより厳密な定義ではなく、現在の端末を意味するために慣習的なやり方で「標準出力」を使用した。 –

16

teeの素敵なカップがあります!

入力 標準出力に出力しても、引数として与えられた任意の ファイルへの標準teeコマンドをコピーします。これはあなただけではなく、パイプの下 いくつかのデータを送信する場合 に便利ですが、私は遅い午後を過ごしていたようにも にコピーし

を保存し、ここではいくつかの見事に説明アスキー・アートの... greyfadeは別の答えに「ファイル」を示していたよう

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

は、通常のファイルである必要はないが、あなたの3番目のコマンドに出力をT字型に分岐パイプをさせるFIFOである可能性があります。

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

しかし、私はその場で仲介ファイルをgzipしたいと思っていますが、これは可能なのでしょうか? –

+0

はい、もう一つのパウエルはすばらしい簡潔を書いています。私がアスキーアート・ダイアグラムで悩んでいる間の答え:) –

+1

しかし、優れた説明のために+1。 –

46

別の方法(bashまたはzshのようなシェルを想定):

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

確かに奇妙な>()構文は、基本的には次のん:

  • は、新たなFIFO(/tmp/で通常は何かを作成します)
  • ()の中でコマンドを実行し、bそのサブコマンドのstdinにFIFOを挿入します。
  • コマンドラインにFIFOファイル名を返します。見終わる何tee

、そして、のようなものです:gzipが見るすべてはその標準入力で

tee /tmp/arjhaiX4 

Bashについては、man bashを参照してください。それはredirectionのセクションにあります。 Zshについては、man zshexpnの「プロセス置換」の見出しを参照してください。

Kornシェル、古典的なBourne Shellの亜種(灰とダッシュを含む)、およびCシェルはこの構文をサポートしていません。ただ、感動ディスクを伴わない方法を投稿する

+0

クール、私はここで何かを学んでいます。あなたは何が起こっているのか詳しく説明できますか? –

+0

投稿を編集します。 – greyfade

+0

私はそれを正しく読めば、teeにファイルを与えたのではなく、gzipの出力を別のファイルに書き込む括弧で囲まれた式に入力としてコピーを送ることになります。圧縮されていないデータは、標準出力にteeをそのまま残します。 –

6

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

/tmpはディスク上にあるのですか?!?!?!? – SamB

+0

セキュリティの観点からは、そうです。 – Joshua

関連する問題