tee – 標準入力を標準出力とファイルへ同時に書き出す

パイプ/リダイレクト
スポンサーリンク

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-interruptsSIGINT(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-errorGNU 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 を使うのが定石です。(ウィキペディア)

参考

スポンサーリンク
Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント