パイプラインの途中結果は見えない
複数のコマンドをパイプでつなぐと、途中のコマンドの出力は最終結果に埋もれて見えなくなる。
$ seq 1 5 | grep 3
3
seq 1 5が1 2 3 4 5を出力していることは、grep 3を通した最終結果3からは分からない。
tee /dev/stderrで途中結果を画面に出す
パイプの途中にtee /dev/stderrを挟むと、そこまでの出力を標準エラーとして画面に表示しつつ、そのまま標準出力として次のコマンドにも渡せる。
コマンド1 | tee /dev/stderr | コマンド2
$ seq 1 5 | tee /dev/stderr | grep 3 > result.txt
1
2
3
4
5
$ cat result.txt
3
画面にはtee /dev/stderrによる1 2 3 4 5が表示され、result.txtにはgrep 3を通した後の3だけが保存される。標準エラーへの出力なので、標準出力のリダイレクト(> result.txt)には影響しない。
用途
複数のコマンドをパイプでつないだ処理がうまくいかないとき、tee /dev/stderrをどこに挟むかで、パイプラインのどの段階までは想定通りの出力になっているかを切り分けられる。確認が終わったらtee /dev/stderr | の部分を削除するだけで、元のパイプラインに戻せる。
\第一線のプログラマーの行動原理を学べる!/
