teeコマンドの使い方完全ガイド|標準出力とファイルへの同時書き込み・sudo連携・オプション解説

コマンドリファレンス

LinuxやUnix系OSのターミナル操作やシェルスクリプト開発において、「コマンドの実行結果を画面(コンソール)でリアルタイムに確認しながら、同時にログファイルにも保存したい」という場面は頻繁に発生します。また、サーバー管理の実務で sudo echo "設定" > /etc/conf を実行して 「Permission denied(許可が拒否されました)」 に遭遇し、困った経験がある方も多いのではないでしょうか。

これらの課題を一発で解決する必須コマンドが tee(ティー)コマンド です。パイプ(|)と組み合わせることで、標準入力を標準出力(画面)へそのまま受け流しつつ、指定した1つ以上のファイルへ同時にデータを分岐して書き込むことができます。

本記事では、tee コマンドの基本構文から主要オプション(-a 追記など)、実務で最も使われる sudo tee による特権ファイル書き込みの仕組み、標準エラー出力(stderr)を巻き込むテクニック、プロセス置換(>())を併用した高度な分岐処理、初心者がハマる終了コード(PIPESTATUS)の落とし穴と解決策 まで、実務目線で徹底解説します。

  • 1. 結論:teeコマンドの書き方早見表(即コピペ用チートシート)
  • 2. teeコマンドとは?仕組みと通常のリダイレクトとの違い
  • 3. 基本構文と主要オプション一覧(-a, -i, -p, –output-error)
  • 4. 実務で必須!teeコマンドの定番テクニック6選
    • 4.1 【超重要】管理者権限ファイルへの安全な書き込み(sudo tee)
    • 4.2 画面表示とログファイル保存を同時に行う(標準エラー出力 2>&1 の統合)
    • 4.3 既存ログを上書きせず追記する(-a オプション)
    • 4.4 複数のファイルへ同時に同一内容を出力・保存する
    • 4.5 パイプラインの中継として使い後続コマンドへ流す
    • 4.6 【高度】プロセス置換と組み合わせて複数処理へ標準入力を分岐
  • 5. 実務でそのまま使える実践シェルスクリプトレシピ
  • 6. 初心者がハマる5大トラブル・注意点と解決策
  • 7. 関連コマンド・代替手段との使い分け(cat・sponge・logger・script)
  • 8. よくある質問(FAQ)
  • 9. まとめ
  1. 1. 結論:teeコマンドの書き方早見表(即コピペ用チートシート)
  2. 2. teeコマンドとは?仕組みと通常のリダイレクトとの違い
    1. 通常のリダイレクト(>)と tee のデータフロー比較
  3. 3. 基本構文と主要オプション一覧(-a, -i, -p, –output-error)
    1. 主要オプション一覧表
  4. 4. 実務で必須!teeコマンドの定番テクニック6選
    1. 4.1 【超重要】管理者権限ファイルへの安全な書き込み(sudo tee)
      1. なぜ sudo echo “…” > /etc/hosts は失敗するのか?
      2. 解決策:sudo tee を使う
      3. 画面への出力を消したい場合は > /dev/null を追加
      4. ヒアドキュメントと組み合わせて複数行を特権書き込み
    2. 4.2 画面表示とログファイル保存を同時に行う(標準エラー出力 2>&1 の統合)
    3. 4.3 既存ログを上書きせず追記する(-a オプション)
    4. 4.4 複数のファイルへ同時に同一内容を出力・保存する
    5. 4.5 パイプラインの中継として使い後続コマンドへ流す
    6. 4.6 【高度】プロセス置換と組み合わせて複数処理へ標準入力を分岐
  5. 5. 実務でそのまま使える実践シェルスクリプトレシピ
    1. レシピ1:スクリプト全体の全出力を画面表示&ファイル自動保存するラッパー
    2. レシピ2:設定ファイルへの安全な設定追記関数(二重追記防止付き)
  6. 6. 初心者がハマる5大トラブル・注意点と解決策
    1. ① パイプラインでの終了ステータス消失(PIPESTATUS と set -o pipefail)
      1. 解決策1:スクリプト冒頭で set -o pipefail を有効化する
      2. 解決策2:${PIPESTATUS[0]} で個別の終了コードを取得する
    2. ② 標準エラー出力を保存し忘れてログが空になる
    3. ③ -a を付け忘れてログを上書き消去してしまう
    4. ④ パイプのバッファリングによる出力遅延
    5. ⑤ 後段のパイプが早期終了したときの Broken Pipe エラー
  7. 7. 関連コマンド・代替手段との使い分け(cat・sponge・logger・script)
  8. 8. よくある質問(FAQ)
    1. Q1. tee コマンドを使うと処理速度(パフォーマンス)は低下しますか?
    2. Q2. tee で出力したログファイルからカラーコード(ANSIエスケープシーケンス)を取り除くには?
    3. Q3. tee は Windows 環境でも使えますか?
    4. Q4. tee でファイルに書き込まず、画面の表示のみを捨てることはできますか?
  9. 9. まとめ
  10. 関連おすすめ記事
  11. 関連記事

1. 結論:teeコマンドの書き方早見表(即コピペ用チートシート)

まずは実務で頻出する定番の tee コマンド一覧をまとめました。急ぎで作業したい場合は、以下のコードをコピーしてファイル名やコマンドを書き換えてご活用ください。

# 1. 画面に表示しながらファイルへ新規保存(上書き)
command | tee output.log

# 2. 画面に表示しながらファイルへ追記(上書きしない)
command | tee -a output.log

# 3. 標準エラー出力も含めて画面表示&ファイル保存
command 2>&1 | tee -a output.log
# (Bash 4.0以降なら短縮記法も可能)
command |& tee -a output.log

# 4. 管理者権限(sudo)が必要なファイルへ書き込む(Permission Denied 回避)
echo "vm.swappiness=10" | sudo tee /etc/sysctl.d/99-swappiness.conf

# 5. sudo tee で画面表示を抑制してファイル書き込みのみ行う
echo "192.168.1.50 db.internal" | sudo tee -a /etc/hosts > /dev/null

# 6. 複数ファイルへ同時に同じ内容を出力する
command | tee log1.txt log2.txt /backup/log3.txt

# 7. 全体をファイル保存しつつ、画面にはエラー行のみをフィルタ表示
make 2>&1 | tee build.log | grep -E "ERROR|WARN"

# 8. ヒアドキュメントを使って複数行の設定ファイルを特権で作成
cat << 'EOF' | sudo tee /etc/nginx/conf.d/sample.conf
server {
    listen 80;
    server_name example.com;
    root /var/www/html;
}
EOF
やりたい操作 実行コマンド ポイント・解説
画面表示+ファイル保存(上書き) cmd | tee file.log 標準出力をコンソールに流しつつ新規ファイルを作成(既存は上書き)
画面表示+ファイル追記 cmd | tee -a file.log -a--append)で既存ログの末尾に追記
標準エラー出力も保存 cmd 2>&1 | tee file.log 2>&1 でエラーメッセージもパイプに流して同時に記録
管理者ファイルへの書き込み echo "..." | sudo tee file Permission denied を回避して root 権限ファイルへ保存
特権追記+画面非表示 echo "..." | sudo tee -a file > /dev/null 余計なコンソール出力を出さずに特権ファイル追記のみ実行
複数ファイルへの同時保存 cmd | tee f1.txt f2.txt スペース区切りで指定したすべてのファイルに同一内容を書き込み
パイプ中継+絞り込み cmd 2>&1 | tee all.log | grep ERR 全ログを保存しながら画面には注目行のみをリアルタイム表示
プロセス置換による分岐 cmd | tee >(gzip > log.gz) >(grep ERR > err.log) 一時ファイルを作らずに複数の後続コマンドへデータを同時パイプ

2. teeコマンドとは?仕組みと通常のリダイレクトとの違い

tee コマンドの名前は、配管工学で使われるアルファベットの「T」の形状をした継手(T字管 / T-junction)に由来します。水流が一本の管から二股に分かれるように、標準入力から流れてきたデータを「標準出力(コンソール)」と「指定ファイル」の2方向へ同時に分岐させる 役割を持ちます。

通常のリダイレクト(>)と tee のデータフロー比較

通常のシェルリダイレクト(>>>)と tee の違いを整理すると以下のようになります。

  • 通常のリダイレクト(command > file.log
    標準出力がすべてファイルへと向けられます。そのため、画面(ターミナル)には一切何も表示されません。コマンドが正常に進んでいるのか、どこで止まっているのかをリアルタイムで確認できません。
  • teeコマンド(command | tee file.log
    標準出力をパイプ経由で受け取った tee が、データをそのまま標準出力(コンソール)へ垂れ流しながら、同時にファイルへも書き込みます。「画面で進捗を目視確認」しつつ「証跡ログを自動保存」 することができます。
【通常のリダイレクト】
[ コマンド ] ──(標準出力)──> [ ファイルのみへ保存 ]
                               (画面には何も出ない)

【tee コマンド】
                               ┌──> [ 画面(標準出力)へ表示 ]
[ コマンド ] ──(パイプ)──> [ tee ]
                               └──> [ ファイルへ保存 ]

これにより、長時間かかるビルド作業、バッチ処理、データベースのバックアップ、サーバーの初期セットアップなどの際に、作業の進行状況をリアルタイムで監視しながら、後からの確認用ログを確実に手元に残すことが可能になります。

3. 基本構文と主要オプション一覧(-a, -i, -p, –output-error)

tee コマンドの基本構文は非常にシンプルです。

tee [オプション...] [出力先ファイル...]

出力先ファイルは省略することも、1つだけでなくスペース区切りで複数のファイルを指定することもできます。

主要オプション一覧表

オプション ロング名 機能説明 実務での活用例
-a --append 既存ファイルを上書きせず、末尾に追記する 定期実行ログや累積ログの蓄積
-i --ignore-interrupts SIGINT(Ctrl + C 等の割り込みシグナル)を無視して書き込みを継続する 大事なログ書き込みの中断事故を防止
-p (なし) パイプ以外の書き込みエラー(ディスクフル等)を適切に診断・警告する(GNU coreutils拡張) パイプライン処理の堅牢化
(なし) --output-error[=MODE] 書き込みエラー時の挙動(warn / warn-nopipe / exit / exit-nopipe)を明示指定する(GNU coreutils拡張) 後段パイプ切断時の安全な継続処理
(なし) --help コマンドの使い方・ヘルプを表示する オプションの確認
(なし) --version バージョン情報を表示する 環境差異(GNU / BSD)の確認

環境による実装差異(GNU vs BSD/macOS vs BusyBox):
Linux(Ubuntu, RHEL, Debian, CentOS, AlmaLinuxなど)で標準搭載されている GNU coreutilstee は全オプションをサポートしています。
一方、macOS や FreeBSD などの BSD系 tee、および Alpine Linux や組込み環境で使われる BusyBox版 では、主に -a-i のみがサポートされており、-p--output-error は使用できない場合があります。移植性の高いシェルスクリプトを書く場合は、基本となる -a オプションを中心に設計するのが安全です。

4. 実務で必須!teeコマンドの定番テクニック6選

ここからは、Linuxエンジニアが日常的に現場で使用している tee コマンドの代表的な活用テクニックを6つ紹介します。

4.1 【超重要】管理者権限ファイルへの安全な書き込み(sudo tee)

サーバー管理やインフラ構築において、初心者が最も頻繁に遭遇するエラーが 「sudo でリダイレクトしたのに Permission denied になる」 という現象です。

なぜ sudo echo “…” > /etc/hosts は失敗するのか?

# 一般ユーザーで実行(失敗例)
$ sudo echo "127.0.0.1 myhost.local" >> /etc/hosts
bash: /etc/hosts: Permission denied

sudo を付けているのになぜ権限エラーになるのでしょうか?その理由は 「シェルのリダイレクト解釈順序」 にあります。

Bash などのシェルは、コマンドを実行する前にまずリダイレクト(>> /etc/hosts)を処理し、ファイルを開こうとします。このとき、リダイレクトを開くのは 「現在ログインしている一般ユーザーのシェル」 です。特権を持つ sudo はその後に起動するため、一般ユーザーには /etc/hosts への書き込み権限がなく、門前払いで Permission denied になってしまうのです。

解決策:sudo tee を使う

この問題を美しく安全に解決するのが sudo tee です。

# 正しい書き方(上書き)
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-custom.conf

# 正しい書き方(追記)
echo "127.0.0.1 myhost.local" | sudo tee -a /etc/hosts

パイプ(|)の後ろで sudo tee を実行すると、tee コマンド自体が root 権限で起動 します。そのため、root 所有の保護されたファイルであっても問題なく書き込み・追記が完了します。

画面への出力を消したい場合は > /dev/null を追加

sudo tee を実行すると、書き込んだ内容がそのまま画面にも表示されます。スクリプト中などで画面出力をクリーンに保ちたい場合は、標準出力を /dev/null に捨てます。

# 画面に出力せず、特権ファイルへの書き込みのみを行う
echo "127.0.0.1 myhost.local" | sudo tee -a /etc/hosts > /dev/null

ヒアドキュメントと組み合わせて複数行を特権書き込み

複数行の設定ファイルや Nginx / Apache の設定を丸ごと作成したい場合は、cat のヒアドキュメント(Here Document)と組み合わせるのが最もスマートです。

cat << 'EOF' | sudo tee /etc/systemd/system/myapp.service
[Unit]
Description=My Custom Application Service
After=network.target

[Service]
Type=simple
User=www-data
ExecStart=/usr/local/bin/myapp
Restart=always

[Install]
WantedBy=multi-user.target
EOF

一時ファイルを作成することなく、root 権限の必要な /etc/systemd/system/ 直下に完全な設定ファイルを一撃で生成できます。

4.2 画面表示とログファイル保存を同時に行う(標準エラー出力 2>&1 の統合)

単に command | tee output.log と書いた場合、保存されるのは 「標準出力(stdout)」のみ です。コマンドが吐き出したエラーメッセージや警告(標準エラー出力 / stderr)はパイプを通過せず画面にしか出ないため、ログファイルに記録されません。

エラーも含めたすべてのコンソール出力を漏れなく保存するには、リダイレクト 2>&1 を使って標準エラー出力を標準出力に合流させます。

# 標準出力と標準エラー出力を両方ファイルに保存しつつ画面表示
./deploy.sh 2>&1 | tee deploy.log

# 追記モードの場合
./deploy.sh 2>&1 | tee -a deploy.log

Bash 4.0以降の短縮記法(|&):
Bash 4.0 以降の環境であれば、2>&1 | の代わりに |& という短縮パイプ記法を使用できます。
./deploy.sh |& tee -a deploy.log
可読性とタイプ数を削減できる便利な書き方です。

4.3 既存ログを上書きせず追記する(-a オプション)

tee のデフォルト動作は「ファイルの新規作成または上書き」です。定期的なバッチ処理(cron)や、複数ステップからなるスクリプト内で同じログファイルへ結果を積み上げていきたい場合は、必ず -a--append)オプション を指定します。

# 日時を付けてログに追記する実務例
echo "=== バックアップ開始: $(date '+%Y-%m-%d %H:%M:%S') ===" | tee -a /var/log/backup.log
rsync -av /data/ /backup/data/ 2>&1 | tee -a /var/log/backup.log
echo "=== バックアップ完了: $(date '+%Y-%m-%d %H:%M:%S') ===" | tee -a /var/log/backup.log

4.4 複数のファイルへ同時に同一内容を出力・保存する

tee は引数に複数のファイルパスを指定することで、1回のコマンド実行で複数の保存先へ同時に書き込むことができます。

# カレントディレクトリとシステムログ、バックアップディレクトリへ同時保存
./heavy_process.sh 2>&1 | tee ./process.log /var/log/app/process.log /mnt/backup/process.log

開発環境のローカルログと監査用の共有ストレージログへ同時に同一内容を配備したい場合などに非常に重宝します。

4.5 パイプラインの中継として使い後続コマンドへ流す

tee は標準出力をそのまま後段に流すため、パイプラインの途中に挟み込んで 「全データをファイルに退避しつつ、後続のコマンドで絞り込みや集計を行う」 という高度な連携が可能です。

# 例1: ビルドログを丸ごと保存しつつ、画面にはエラーと警告だけを即時表示
npm run build 2>&1 | tee build_all.log | grep -Ei "error|fail|warn"

# 例2: 検索結果の一覧をファイルに残しつつ、ヒット件数をカウント
find /var/www -type f -name "*.php" | tee php_files.txt | wc -l

# 例3: アクセスログからステータス500の行を抽出し、ファイル保存しながらユニークIPを集計
cat access.log | grep " 500 " | tee error_500.log | awk '{print $1}' | sort | uniq -c | sort -nr

grepawksed と組み合わせることで、データの全体バックアップとリアルタイムフィルタリングを1行のワンライナーで完結できます。

4.6 【高度】プロセス置換と組み合わせて複数処理へ標準入力を分岐

Bash の強力な機能である プロセス置換(Process Substitution: >(command)tee を組み合わせると、一時ファイルを作成することなく、1つのストリームを複数の異なる処理へ同時にパイプ分岐 させることができます。

# 1回のストリーム出力を「そのまま画面表示」「gzip圧縮保存」「エラー行のみ別ファイル抽出」へ3分岐
./run_tests.sh 2>&1 | tee >(gzip -c > full_log.gz) >(grep "FAIL" > failed_tests.log)

このコマンドを実行すると、以下がすべて同時に並行実行されます:

  • 画面には全体のテスト結果がリアルタイムで流れる
  • full_log.gz には圧縮された全ログが保存される
  • failed_tests.log には失敗したテスト行(FAIL)のみが自動抽出されて保存される

ディスクI/Oを最小限に抑えながら高度なログ解析を行える、プロの現場ならではのテクニックです。

5. 実務でそのまま使える実践シェルスクリプトレシピ

ここからは、実際の業務スクリプトにそのままコピペして組み込める実践的なパターンを紹介します。

レシピ1:スクリプト全体の全出力を画面表示&ファイル自動保存するラッパー

スクリプト内の全コマンドの末尾にいちいち | tee -a log.txt と書くのは面倒ですし、書き忘れの原因になります。スクリプトの冒頭で exec コマンドと tee を組み合わせると、スクリプト全体の全標準出力・全標準エラー出力を自動的に画面表示&ログ保存 できます。

#!/usr/bin/env bash
set -euo pipefail

# ログファイルの設定
LOG_DIR="/var/log/my_app"
mkdir -p "$LOG_DIR"
LOG_FILE="${LOG_DIR}/batch_$(date +'%Y%m%d_%H%M%S').log"

# スクリプト全体の全出力を tee に転送(画面表示 + ログ追記)
exec > >(tee -a "$LOG_FILE") 2>&1

echo "=== バッチ処理を開始します ==="
echo "実行ユーザー: $(whoami)"
echo "開始時刻: $(date '+%Y-%m-%d %H:%M:%S')"

# 以降の通常コマンド出力もすべて自動でログに記録される
ls -la /var/www
df -h

echo "=== バッチ処理が正常に完了しました ==="

この exec > >(tee -a "$LOG_FILE") 2>&1 という1行を入れておくだけで、以降のすべてのコマンド出力・エラー出力が自動的にログファイルに蓄積されます。

レシピ2:設定ファイルへの安全な設定追記関数(二重追記防止付き)

インフラのプロビジョニングスクリプトなどで、設定ファイルに特定の設定行が存在しない場合のみ sudo tee -a で追記する安全な関数テンプレートです。

#!/usr/bin/env bash
set -euo pipefail

append_config_if_missing() {
    local target_file="$1"
    local config_line="$2"

    if sudo grep -qxF "$config_line" "$target_file" 2>/dev/null; then
        echo "[SKIP] 既に設定が存在します: ${target_file} -> ${config_line}"
    else
        echo "$config_line" | sudo tee -a "$target_file" > /dev/null
        echo "[ADDED] 設定を追加しました: ${target_file} -> ${config_line}"
    fi
}

# 使用例
append_config_if_missing "/etc/security/limits.conf" "* soft nofile 65535"
append_config_if_missing "/etc/security/limits.conf" "* hard nofile 65535"

6. 初心者がハマる5大トラブル・注意点と解決策

tee コマンドを扱う際に、多くのエンジニアがつまずきやすい落とし穴とその回避策をまとめました。

① パイプラインでの終了ステータス消失(PIPESTATUS と set -o pipefail)

スクリプト内でエラー検知を行う際、最も重大な事故原因 になるのがパイプラインの終了ステータスです。

# 失敗するコマンドを tee に通す
$ non_existing_command | tee output.log
bash: non_existing_command: command not found

# 終了コードを確認
$ echo $?
0

non_existing_command は確実にエラーで失敗しているにもかかわらず、直後の $?(終了ステータス)を確認すると 「0(成功)」 になっています。なぜなら、デフォルトの Bash では 「パイプライン全体の終了ステータスは、一番最後に実行されたコマンド(この場合は tee)の終了ステータスになる」 からです。tee 自体は正常に空文字を受け取って終了したため、全体の終了コードが 0 に上書きされてしまい、スクリプトのエラーハンドリングをすり抜けてしまいます。

解決策1:スクリプト冒頭で set -o pipefail を有効化する

Bash スクリプトの冒頭に set -o pipefail を宣言しておくと、パイプライン内のいずれかのコマンドが失敗した場合、その非ゼロステータスがパイプ全体の終了ステータスとして返されるようになります。

#!/usr/bin/env bash
set -euo pipefail  # パイプ内のエラーも検知

non_existing_command | tee output.log
# ここでスクリプトは即座にエラー停止する

解決策2:${PIPESTATUS[0]} で個別の終了コードを取得する

Bash 特有の配列変数 ${PIPESTATUS[@]} を参照することで、パイプライン内の各コマンドの終了コードを個別に確認できます。

make test 2>&1 | tee test.log
STATUS_MAKE=${PIPESTATUS[0]}
STATUS_TEE=${PIPESTATUS[1]}

if [ "$STATUS_MAKE" -ne 0 ]; then
    echo "ビルド・テストが失敗しました (Code: $STATUS_MAKE)" >&2
    exit "$STATUS_MAKE"
fi

② 標準エラー出力を保存し忘れてログが空になる

command | tee log.txt とだけ実行すると、標準出力しか保存されません。コマンドが異常終了した際のエラーメッセージがログファイルに残っておらず、「なぜ失敗したのかログを見ても分からない」という事態に陥ります。ログ取得目的で tee を使う際は、必ず 2>&1 | tee または |& tee を使用する習慣 を付けましょう。

③ -a を付け忘れてログを上書き消去してしまう

蓄積したいログファイルに対して tee-a なし)を実行すると、過去の全ログが一瞬で消去(truncate)されてしまいます。累積ログや追記を前提とする場面では、-a が付いているかを二重チェックしてください。

④ パイプのバッファリングによる出力遅延

コマンドの出力をパイプに通すと、OS の C言語標準ライブラリ(glibc)の仕様により、出力が「行バッファリング」から「ブロックバッファリング(通常4KB〜8KB単位)」に切り替わることがあります。そのため、画面やファイルへの出力がリアルタイムに行われず、データがまとめてドバッと出力される現象が起きます。

完全なリアルタイム表示を行いたい場合は、stdbuf コマンドを使ってバッファリングを行単位に固定します。

# 標準出力を強制的に行バッファリングにして tee に流す
stdbuf -oL -eL ./long_running_script.sh 2>&1 | tee -a run.log

⑤ 後段のパイプが早期終了したときの Broken Pipe エラー

tee の後段に head などのコマンドを繋ぐと、後段コマンドが規定行数を受け取った時点でパイプを閉じてしまうため、tee: 'standard output': Broken pipe という警告が出ることがあります。

GNU coreutils の tee であれば、--output-error=warn-nopipe または --output-error=exit-nopipe を指定することで、パイプ切断時の警告や終了を柔軟にコントロールできます。

7. 関連コマンド・代替手段との使い分け(cat・sponge・logger・script)

ファイル出力やログ記録に関わる代表的なコマンド群と tee の使い分けを比較表にまとめました。

コマンド 主な役割 tee との違い・使い分けの基準
tee 標準入力を画面とファイルへ分岐 画面確認とファイル保存を両立したいときの第一選択
cat ファイルの閲覧・連結・新規作成 分岐機能はない。ファイルの単純な連結やヒアドキュメントでのファイル生成に使用
sponge パイプ入力をメモリに溜めて同じファイルに上書き grep "foo" file.txt | sponge file.txt のように「読み込み元と同じファイルへの安全な上書き」に使用(moreutils パッケージ)
logger 標準入力を syslog / journald に送信 OS のシステムログデーモンにログを正式に集約・転送したい場合に使用
script ターミナルセッション全体の入出力を完全録画 コマンド入力、プロンプト、対話的な操作(パスワード入力画面など)も含めて端末作業をまるごと記録したい場合に使用
tail -f ファイルの末尾をリアルタイム監視 すでにバックグラウンドで出力されているログファイルを別ターミナルからリアルタイム監視する際に使用

8. よくある質問(FAQ)

Q1. tee コマンドを使うと処理速度(パフォーマンス)は低下しますか?

A. ほとんどのケースで体感的な性能低下はありません。
tee は極めて軽量な C 言語プログラムであり、メモリ上でデータを複製して書き出すため CPU 負荷は無視できるレベルです。ただし、毎秒数百メガバイト単位の超大量データを高頻度で書き込むような I/O バウンドな処理では、ディスクの書き込み速度がボトルネックになる可能性があります。

Q2. tee で出力したログファイルからカラーコード(ANSIエスケープシーケンス)を取り除くには?

A. sedansi2txt を通してから tee に渡すか、プロセス置換で除去します。
ターミナル向けの色付き出力(\e[31m など)がログファイルにそのまま入ると見づらくなる場合があります。以下のように sed でエスケープシーケンスを除去して保存できます。

# 画面にはカラーで表示しつつ、ファイルには色コードを除去して保存
command 2>&1 | tee >(sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" > clean.log)

Q3. tee は Windows 環境でも使えますか?

A. はい、PowerShell の Tee-Object または WSL / Git Bash で利用できます。
Windows の PowerShell には標準で Tee-Object(エイリアス: tee)が用意されています。

# PowerShell での例
Get-Process | Tee-Object -FilePath "process.txt"

また、WSL(Windows Subsystem for Linux)や Git Bash を使えば、Linux と全く同じ構文で tee を実行できます。

Q4. tee でファイルに書き込まず、画面の表示のみを捨てることはできますか?

A. はい、tee /path/to/file > /dev/null で実現できます。
前述の sudo tee /etc/file > /dev/null のように、標準出力を /dev/null にリダイレクトすることで、ファイル書き込みだけを行い画面出力を完全に抑止できます。

9. まとめ

tee コマンドは、Linux の「標準入出力」「パイプライン」の思想を象徴する、シンプルでありながら極めて汎用性の高い重要コマンドです。

  • 基本command | tee output.log で画面表示とファイル保存を同時実行
  • 追記-a オプションで既存ログを上書きせず末尾に蓄積
  • 特権操作echo "..." | sudo tee /etc/file でリダイレクト時の Permission denied をスマートに回避
  • エラー統合2>&1 | tee(または |& tee)で標準エラー出力も含めて完全ログ保存
  • 安全運用:Bash スクリプトでは set -o pipefail${PIPESTATUS[0]} でコマンド自体の失敗ステータスを確実に検知
  • 応用:プロセス置換 >(...) と組み合わせて、一時ファイルなしで複数コマンドへ並行分岐

日頃のコマンドライン作業から本番サーバーのシェルスクリプト運用まで、tee コマンドを使いこなして安全で効率的な Linux 運用を実現してください。

\n

関連おすすめ記事

\n

Bash玄

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

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

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

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

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

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

Bash玄をフォローする

コメント