tee コマンド入門 - 出力を分岐させる

tee コマンド入門 - 出力を分岐させる

tee って何?

リナ: パイプ(|)でコマンドをつなぐのは覚えたんですけど、途中の結果も手元に残したいなあって思うんです。
ライニー先輩: それが tee の出番だよ!「T字型の水道管」みたいに、出力を分岐させるコマンドなんだ。

パイプでコマンドをつなぐとき、出力は次のコマンドへ流れていくだけです。でも tee を使うと、流しながらファイルにも保存できます。

通常のパイプ:
コマンドA → コマンドB(途中は見えない)

tee を使うと:
コマンドA → tee ─→ ファイルに保存
               ↓
           コマンドBへも流れる

tee の名前の由来

英字の大文字「T」の形に似ているから。入力が 1 本で、出力が 2 方向に分岐します。

基本的な使い方

リナ: どう使うんですか?
ライニー先輩: パイプの途中に tee ファイル名 を挟むだけ!
command | tee ファイル名

ls -la の結果を画面に表示しながら list.txt に保存

ls -la | tee list.txt

実行すると、画面に結果が表示されつつ、list.txt にも同じ内容が書き込まれます。

ポイント

  • 画面への表示:止まらずそのまま出る
  • ファイルへの保存:同時に書き込まれる

> リダイレクトとの違い

リナ: じゃあ ls -la > list.txt とどう違うんですか?
ライニー先輩: いい質問!> は画面には表示されないけど、tee は画面にも出るんだよ。
方法 画面への表示 ファイルへの保存
command あり なし
command > file なし あり
command | tee file あり あり

どちらを使うかは目的次第。「確認しながら保存したい」なら tee、「とにかくファイルに保存するだけ」なら > で十分です。

実行ログを残しながら確認する

リナ: 使いどころってどんなときですか?
ライニー先輩: たとえばインストールや make コマンドを実行するとき、ログを残しながら進捗も確認したいよね。
make install 2>&1 | tee install.log

2>&1 は「エラー出力も一緒に流す」という指定です。これでエラーメッセージも含めてログに残せます。

2>&1 とは

  • 1 = 標準出力(通常の出力)
  • 2 = 標準エラー出力(エラーメッセージ)
  • 2>&1 = エラーも標準出力にまとめる

これを書かないと、エラーメッセージはファイルに入らず画面にしか出ません。

-a オプション:追記する

リナ: tee でファイルに保存するとき、毎回上書きされちゃうんですよね?
ライニー先輩: デフォルトはそう。追記したいときは -a オプションをつけよう。
command | tee -a ファイル名

:毎回の実行結果を同じログファイルに追加していく

date | tee -a run.log
date | tee -a run.log
cat run.log
Mon Jun  1 03:00:00 UTC 2026
Mon Jun  1 03:00:05 UTC 2026

-a なしで tee を使うと、毎回ファイルが上書きされます。ログを蓄積したいときは必ず -a をつけましょう。

複数ファイルに同時保存

リナ: 2 つのファイルに同時に保存できたりしますか?
ライニー先輩: できるよ!ファイル名を並べるだけ。
command | tee ファイル1 ファイル2

/tmp/result.txt~/backup.txt の両方に保存

ls -la | tee /tmp/result.txt ~/backup.txt

ファイルはいくつでも並べられます。全部に同じ内容が書き込まれます。

sudo tee で root ファイルに書き込む

リナ: root 権限が必要な設定ファイルを変えたいとき、どうするんですか?
ライニー先輩: sudo tee の出番!sudo と組み合わせると、root 権限が必要なファイルにも書き込めるんだ。

root 権限が必要なファイルを書き換えたいとき、sudo echo > file はうまくいきません。

# これは失敗する(リダイレクトはシェルの処理なので sudo の効果が届かない)
sudo echo "127.0.0.1 example.local" >> /etc/hosts

sudo echo > file が失敗する理由:sudo がかかるのは echo コマンドだけです。>> によるリダイレクトはシェル自身が処理するため、一般ユーザー権限のままになります。

sudo tee を使うと正しく書き込めます。

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

これは echo でテキストを生成し、それを sudo tee に流すことで、root 権限で /etc/hosts に追記しています。

画面に内容が出力されて邪魔な場合は、末尾に > /dev/null をつけると抑制できます。

echo "127.0.0.1 example.local" | sudo tee -a /etc/hosts > /dev/null

sudo tee は強力なコマンドです。/etc/ 配下の重要なファイルを書き換えるときは、必ず事前にバックアップを取りましょう。

sudo cp /etc/hosts /etc/hosts.bak

パイプの途中で結果を確認する

リナ: パイプが長くなると、途中で何が流れてるか分からなくなります。
ライニー先輩: tee をデバッグに使うといいよ!途中経過をファイルに保存しながら次のコマンドに流せる。
cat access.log | grep "ERROR" | tee /tmp/errors.txt | sort | uniq -c

上のコマンドでは:

  1. grep "ERROR" で絞り込んだ結果を tee/tmp/errors.txt に保存
  2. その後 sort | uniq -c で集計

途中結果を cat /tmp/errors.txt で確認できるのでデバッグに役立ちます。

パイプが複数段ある場合は、各ステップで tee を使って途中結果を保存しながら進めると原因特定がしやすくなります。

まとめ

リナ: tee、便利ですね!パイプの途中でファイルに保存できるって、すごく使えそう。
ライニー先輩: そう!特に sudo tee は実務でよく出てくるパターンだから覚えておくと便利だよ。ログを残しながら作業するのも大事な習慣だしね。
用途 コマンド例
画面表示しながら保存 command | tee file.txt
追記保存(上書きしない) command | tee -a file.txt
複数ファイルに保存 command | tee file1 file2
root ファイルに書き込む echo "..." | sudo tee -a /etc/hosts
パイプ途中の出力を確認 cmd1 | tee /tmp/debug.txt | cmd2

次に読む