デフォルトでは書き込み先のパイプが壊れると終了する
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版の違い
\第一線のプログラマーの行動原理を学べる!/
