デフォルトでは書き込み先のパイプが壊れると終了する

teeコマンドの標準出力を次のコマンドにパイプでつないでいるとき、次のコマンドが標準入力を早めに閉じると、teeコマンドはデフォルトで終了する。

$ seq 1 5000000 | tee out1.txt | head -n 1
1
$ wc -l out1.txt
14139 out1.txt

head -n 1が1行読んだ時点でパイプを閉じるため、teeコマンドは書き込みエラーで終了し、out1.txtには途中までしか保存されない。

-pでパイプが壊れても実行を続ける

GNU coreutils版のteeコマンドには-pオプションがあり、パイプ向けにより適切な挙動にする。

コマンド | tee -p 保存先ファイル | 次のコマンド
$ seq 1 5000000 | tee -p out2.txt | head -n 1
1
$ wc -l out2.txt
5000000 out2.txt

-pを付けると、標準出力へのパイプが壊れてもエラーを警告するだけで実行を続け、out2.txtにはすべての行が保存される。すべての出力先が壊れたパイプになった場合のみ終了する。

用途

| head| lessのように途中で読むのをやめるコマンドと組み合わせつつ、ファイルには完全なログを残したい場合に-pが使える。macOS標準のBSD版teeには-pが無いため、Homebrewのcoreutilsパッケージが必要になる。

参考: 【tee】macOS標準とHomebrewのGNU版の違い