pee & tee
POSIX の標準コマンドである tee と moreutils に収録されている 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