リダイレクトを分割したい(tee)
// 上書き
$ コマンド | tee ログファイル名
// 追記
$ コマンド | tee -a ログファイル名
teeは、コマンドの実行結果をターミナル画面に表示しながら、ファイルにも保存できるコマンドです。
リダイレクトしたい(>)で紹介したリダイレクト(>)を使いはじめると、すぐにぶち当たる壁があります。
それは、ファイルにリダイレクトしてしまうと、実行結果がターミナル画面に表示されないことです。
teeは、その不便さを解決してくれるコマンドです。
ファイルに保存したい
$ ls -la | tee output.txt
$ find . -name "*.txt" | tee results.md
ファイルに追記したい(--append)
$ コマンド | tee --append log.md
$ コマンド | tee -a log.md
--append(-a)オプションで、既存のファイルに追記できます。
ファイルが存在しない場合は、新規に作成します。
標準出力と標準エラー出力を保存したい
$ コマンド 2>&1 | tee log.md
2>&1をパイプすると、標準出力と標準エラー出力の両方をターミナルに表示しながら、ファイルに保存できます。
エラーの原因を調査しているときに便利です。
複数のファイルに保存したい
$ コマンド | tee file1.txt file2.txt
teeはファイル名を複数指定すると、同じ内容をまとめて保存できます。
名前の由来である配管のT字継手のように、ひとつの出力を複数の経路に分けるイメージです。
権限が必要なファイルに保存したい(sudo)
$ echo "設定" | sudo tee /etc/some-config
sudo コマンド > ファイル名と書いても、リダイレクト自体はシェルが実行するため、権限エラーになります。
teeをsudoで実行すれば、書き込み権限をteeに与えられるので、この問題を回避できます。
パイプラインの途中経過を確認したい
$ cat data.csv | tee step1.log | grep error | tee step2.log | wc -l
複数のコマンドをパイプでつないだ処理の場合、teeを挟むことで、各段階の出力を保存しながら次のコマンドに渡せます。
意図しない結果になったときに、どの段階で問題が起きたかを確認するのに便利です。