Help us understand the problem. What is going on with this article?

teeで標準入力を複製する

More than 3 years have passed since last update.

たまに、標準出力も標準エラー出力もログに記録しつつ、画面に標準エラー出力を出したいとかのケースで、標準出力を2つのストリームに複製して別の処理をさせたいなぁって時があります。

tee 単体で出来るじゃん!

こんな感じ。

seq 10 | tee >(cat > all.log) >(grep '[02468]$' > even.log) >(grep '[13579]$' > odd.log)

これでよかった。

古い内容(今となっては若気の至りな内容…だがまぁこねくりまわしてみたかった黒歴史として残しておく)

そんな時は tee /dev/stderr すると便利な時があるよってメモです。

上記リンク先のケースに当てはめてみると↓こんな感じで書けます。

## 上書き
command >/tmp/foolog 2> >(tee /dev/stderr)
## 追記
command >>/tmp/barlog 2> >(tee /dev/stderr)

説明

データの流れは以下の図のような感じになってます。

command ─┬─ 1 ──────────────┬─────────> /tmp/foolog
         └─ 2 ─> tee ─┬─ 1 ─┘
                      └─ /dev/stderr ─> 2
  1. commandの標準エラーをteeに繋げて、
  2. teeの引数にstderrを指定することで1本の標準入力を標準出力と標準エラーに複製してます。
  3. で、teeの標準出力はcommandの標準出力に合流して合体、
  4. stderrから生まれた標準エラーはそのまま外部に垂れ流されてttyに表示されたりcronにキャッチされたりする感じです。

> >(...)の部分はBashの Process Substitution っていう機能で、以前書いたエントリの「2つのコマンドの出力結果のdiffを取る」とか「teeでgz圧縮しながら保存させる」とかでも使ってます。上手く使うと中間ファイルが必要そうなところが不要になって結構便利です。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away