pee & tee

POSIX の標準コマンドである teemoreutils に収録されている pee を同じ様に使おうとしたところ、微妙に挙動が違ったので書いておく。

一応 tee について復習しておくと、標準入力から受け取った入力をファイルに保存しつつ標準出力に返すコマンドである。 POSIXのマニュアル にある様に、以下の様なパイプライン中で使うことが多い。Wikipedia にある様に、T字路を思い描くと雰囲気が掴める。

... | tee unsorted | sort > sorted

tee ではパイプラインの途中でファイルに保存することができるが、パイプラインを分岐させたいことも少なくない。 tee でも FIFO を使ったり bash拡張のプロセス置換を使うことでパイプラインを分岐させることはできるが、より簡潔にパイプラインが分岐できると嬉しい。 pee は正にこのためにあるコマンドで、標準入力から受け取った入力をパイプラインで渡すことができる。

teeの例

tee は標準入力から受け取った入力を標準出力及び引数として受け取ったファイルに吐くので、 rev した結果以外に受け取ったままの文字列も出力される。

echo hoge | tee >(rev)
hoge
egoh

rev の前に cat を付けると、

  • 受け取った文字列
  • cat された文字列
  • rev された文字列

の3つが出力される。

echo hoge | tee >(cat) >(rev)
hoge
hoge
egoh

pee

一方 pee は標準入力から受け取った入力を引数として受け取ったコマンドに渡すので、 rev した結果だけが出力される。

echo hoge | pee 'rev'
egoh

標準入力から受け取った入力も標準出力に吐きたい場合には、例えば cat を渡す必要がある。

echo hoge | pee 'cat' 'rev'
hoge
egoh