tee はパイプの途中で結果をファイルにも書き出すコマンドです。`>` との違い、追記の `-a`、権限のあるファイルに書き込む `sudo tee` の使い方を、ブラウザ上のターミナルで打ちながら確認できます。
最終更新: 2026-09-06
コマンド | tee [オプション] ファイル...
受け取った内容を画面とファイルの両方に出します。
grep の結果を、目で見つつファイルにも残します。
$ grep ERROR logs/app.log | tee errors.txt
ERROR connection refused
ERROR timeout
ERROR connection refused
画面に出ました。 同時に、同じ内容がファイルにも入っています。
$ ls
errors.txt logs/
$ cat errors.txt
ERROR connection refused
ERROR timeout
ERROR connection refused
> を使うと画面には何も出ません。
見ながら残したいときが tee の出番です。
tee は受け取った内容をそのまま次へ流します。 だから、パイプの途中に挟めます。
$ grep ERROR logs/app.log | tee errors.txt | wc -l
3
最終的に欲しいのは件数(3)ですが、途中の一覧も errors.txt に残りました。
長いパイプを組むときに、途中経過を確かめる用途でも使えます。
-a を付けると、上書きせずに末尾へ足します。
$ echo 'ERROR manual entry' | tee -a errors.txt
ERROR manual entry
$ cat errors.txt
ERROR connection refused
ERROR timeout
ERROR connection refused
ERROR manual entry
tee がいちばん効くのはこの場面です。
/etc の下のファイルには、そのままでは書き込めません。
$ echo '10.0.0.1 db' >> /etc/hosts
zsh: permission denied: /etc/hosts
sudo を付けても、>> を実行するのはシェルなので結果は変わりません。
書き込む側を root にするために、tee を使います。
$ echo '10.0.0.1 db' | sudo tee -a /etc/hosts
10.0.0.1 db
$ cat /etc/hosts
127.0.0.1 localhost
10.0.0.1 db
sudo tee -a は、設定ファイルに1行足すときの定番の書き方です。
ファイル名を並べると、全部に同じ内容が入ります。
$ grep INFO logs/app.log | tee info.txt summary.txt
INFO server started
INFO retrying
$ ls
errors.txt info.txt logs/ summary.txt
tee は、流れを止めずに記録を残したいときに打つコマンドです。
| 場面 | 打ち方 |
|---|---|
| 結果を見ながらファイルにも残す | grep ERROR app.log | tee errors.txt |
| パイプの途中経過を保存する | ... | tee mid.txt | wc -l |
| 設定ファイルに1行足す | echo "..." | sudo tee -a /etc/hosts |
| ログを追記で貯める | ... | tee -a run.log |
-a を忘れると上書きです。
tee run.log は毎回ファイルを作り直します。
貯めたいときは必ず -a を付けてください。
sudo は > には効きません。
リダイレクトを処理するのはシェルなので、sudo の権限で動くのはコマンドだけです。
これが sudo tee という書き方が生まれた理由です。
画面に出したくないときは向きません。
tee は必ず画面にも出します。
静かに書き込みたいだけなら > か >> を使ってください。
webterm.appこのサイト
ターミナル基礎
よく使うコマンドを学ぶ
learn.webterm.app別のサイト
