リダイレクトを分割したい(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を挟むことで、各段階の出力を保存しながら次のコマンドに渡せます。 意図しない結果になったときに、どの段階で問題が起きたかを確認するのに便利です。