Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

tee

『tee』はパイプの途中でデータをファイルに書き出しながら、次のコマンドにもそのままデータを流すコマンドです。名前はT字型の配管パーツに由来します。ビルドログを保存しながらターミナルにも表示したい場合などに使います。

構文
コマンド | tee [オプション] [ファイル...]
オプション一覧
オプション概要
tee ファイル標準入力をファイルに書き込みつつ標準出力にも流します。
tee -a ファイルファイルに上書きせず追記します。
tee ファイル1 ファイル2複数のファイルに同時に書き込みます。
tee /dev/null標準出力への通過のみで実質 cat と同じ動作になります。
サンプルコード

以下の例で『tee』の動作を説明します。『tee』はパイプの途中でデータを分岐させるT字型の配管をイメージしてください。

# データの流れ:
# コマンドの出力 → tee → ファイルに保存
#                     └→ 標準出力(次のコマンドへ)

標準入力をファイルに書き込みつつ、標準出力にも流します。

echo "Hello" | tee output.txt
Hello
cat output.txt
Hello

ビルドの出力をターミナルに表示しながらログファイルにも保存します。『2>&1』で標準エラーも含めます。

make 2>&1 | tee build.log

『-a』でファイルに上書きせず追記します。ログに追記しつつエラーだけフィルタする例です。

make 2>&1 | tee -a build.log | grep -E "error|warning"

複数のファイルに同時に書き込みます。

echo "test data" | tee file1.txt file2.txt file3.txt
test data

『sudo tee』でルート権限が必要なファイルに書き込みます。『sudo echo > /etc/hosts』はリダイレクトが sudo の権限外で実行されるため失敗しますが、パイプ経由の『sudo tee』なら正しく書き込めます。

echo "127.0.0.1 myapp.local" | sudo tee -a /etc/hosts
127.0.0.1 myapp.local

パイプの途中で中間結果をファイルに保存して、後から確認できるようにします。

cat access.log | tee /tmp/debug.log | grep "ERROR" | wc -l
3
概要

『sudo tee』パターンはルート権限が必要なファイルに書き込む際のよく使うイディオムです。『sudo echo "..." > /etc/hosts』はリダイレクトが sudo の権限外で実行されるため失敗しますが、パイプ経由で『sudo tee』を使えば正しく書き込めます。

パイプの基本については『パイプ(|)』を、リダイレクトについては『出力リダイレクト(>)』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。