tee はパイプで受け取った標準入力を、そのまま標準出力に流しつつ、同時に1つ以上のファイルにも書き込むコマンドです。
ログを画面で見ながら保存したり、後段のパイプに流しつつ記録したいときに使います。(ウィキペディア)
構文(Syntax)
tee [OPTION...] [FILE...]
# 例
cmd | tee output.log # 上書き
cmd | tee -a output.log # 追記
cmd | tee file1 file2 # 複数ファイルへ同時出力
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
-a, --append | 既存ファイルを上書きせず追記する | make 2>&1 | tee -a build.log (Debian Manpages) |
-i, --ignore-interrupts | SIGINT(Ctrl+C)を無視して書き出しを継続 | long_cmd | tee -i run.log (Debian Manpages, FreeBSD マニュアルページ) |
-p | パイプ以外への書き込みエラーを診断(GNU拡張) | cmd | tee -p out.log (Debian Manpages) |
--output-error[=MODE] | 書き込みエラー時の挙動を指定(warn/warn-nopipe/exit/exit-nopipe)。既定は「パイプへの書き込みエラーで即終了」 | cmd | tee --output-error=warn out.log (GNU, Debian Manpages) |
--help, --version | ヘルプ・バージョン表示 | tee --help (LinuxCommand) |
実装差分: BSD の
teeは概ね-aと-iのみ。-pや--output-errorは GNU coreutils の拡張です。BusyBox 版も最小限のオプションに限られます。(FreeBSD マニュアルページ, Debian Manpages, BusyBox)
実行例
画面に表示しつつファイルへ保存(標準エラーも含める)
説明: ビルド出力を確認しながらログに保存します。
コマンド:
make 2>&1 | tee build.log
追記モードでログを積み上げる
説明: 同じログファイルに追記していきます(上書きしない)。
コマンド:
script.sh 2>&1 | tee -a /var/log/script.log
権限のあるファイルへ書く(sudo と組み合わせ)
説明: リダイレクト(>)はシェルが行うため sudo echo ... > /root/file は失敗しがち。tee を使えば昇格して安全に追記できます。
コマンド:
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.d/99-custom.conf > /dev/null
(> /dev/null は画面への重複出力を抑止) (ウィキペディア)
後段のパイプが早期終了してもファイル書き込みを継続
説明: 既定ではパイプへの書き込みエラーで即終了します。--output-error=warn を付けると、ファイルへの書き込みを続行しつつ警告します(GNU)。
コマンド:
echo "hello" | tee --output-error=warn out.txt | :
# => tee: 'standard output': Broken pipe (警告)
# それでも out.txt への書き込みは継続
(GNU, Unix & Linux Stack Exchange)
複数のファイルに同時保存
説明: 同じ内容を複数のログに同時保存します。
コマンド:
cmd | tee /var/log/app.log ./debug.log
エラー例:書き込み権限がない
説明: 権限のない場所に出力すると失敗し、終了ステータスは非0になります。
コマンド:
echo test | tee /root/forbidden.txt
# tee: /root/forbidden.txt: Permission denied
echo $? # -> 非0
関連コマンド
cat: ファイル内容を標準出力へ表示(複製はしない)。sponge(moreutils): 標準入力を一度吸い込んでから同じファイルへ安全に上書きする(cmd | sponge file)。logger: 標準入力を syslog に送る。script/scriptreplay: 端末セッションの記録。stdbuf: バッファリング挙動の調整(パイプ遅延の対策に)。
備考
- バッファリング:
teeは無バッファで書き出します(実装依存で行単位などの最小バッファ)。(man.archlinux.org) - GNU/BSD/BusyBox の違い: GNU 版は
-pと--output-errorをサポートし、**パイプ切断時(SIGPIPE)**の扱いを細かく制御できます。BSD 版は-a/-iが中心、BusyBox 版はさらに簡素です。用途や環境に応じてtee --helpを確認してください。(GNU, FreeBSD マニュアルページ, BusyBox) - 終了ステータス: いずれかの出力に失敗すると終了コードは非0になります。
--output-errorのモードにより「警告して継続」か「即終了」かを選べます。(GNU) - リダイレクトとの違い:
sudoは後続のリダイレクトには効かないため、特権ファイルに書く場合はsudo teeを使うのが定石です。(ウィキペディア)
参考
- GNU coreutils マニュアル(
teeの詳細・--output-errorの説明): (GNU) - Debian manpages:
tee(1)(GNU 版オプションの解説): (Debian Manpages) - POSIX
tee(1p)(仕様): (man.archlinux.org) - FreeBSD
tee(1)(BSD の実装差): (FreeBSD マニュアルページ) - BusyBox ドキュメント(実装の最小オプション): (BusyBox)

コメント