閉じる

Bashのteeコマンド活用術:画面表示とファイル保存を同時に行う基本と実践テクニック

LinuxやmacOSのターミナルで作業を行う際、実行したコマンドの出力をリアルタイムで画面に表示しつつ、同時にファイルへ保存したい場面は非常に多くあります。

通常、リダイレクト記号である>を使用すると出力はファイルに書き込まれますが、ターミナル上には何も表示されなくなってしまいます。

このような悩みを解決し、作業効率を飛躍的に向上させてくれるのが、Bashにおける「tee」コマンドです。

本記事では、teeコマンドの基本的な使い方から、実務で役立つ応用テクニックまでを詳しく解説します。

teeコマンドの基本概念と役割

teeコマンドは、標準入力を読み込み、それを標準出力とファイルの両方に書き出すという動作をします。

この名前は、水道管などで使われる「T字型の継手(T-junction)」に由来しています。

一本の入力ストリームを、画面表示用とファイル保存用の二方向に分岐させるイメージを持つと理解しやすいでしょう。

標準的なリダイレクトとの最大の違いは、「出力を止めることなく、データのコピーをファイルに記録できる」という点にあります。

これにより、長時間の処理を実行しながら、その進捗を自分の目で確認しつつ、後で分析するためのログファイルを残すことが可能になります。

teeコマンドの基本的な構文

teeコマンドを使用する際の最も基本的な構文は、パイプ(|)を使用して他のコマンドから入力を受け取る形になります。

Shell
コマンド | tee ファイル名

例えば、ls -lコマンドの結果を画面に表示し、同時に「list.txt」というファイルに保存する場合は以下のようになります。

Shell
ls -l | tee list.txt
実行結果
total 8
-rw-r--r-- 1 user group 123 Jan 1 12:00 file1.txt
-rw-r--r-- 1 user group 456 Jan 1 12:00 file2.txt

このコマンドを実行すると、ターミナル上にファイル一覧が表示されると同時に、カレントディレクトリに「list.txt」が作成されます。

なお、指定したファイルが既に存在する場合、デフォルトでは「上書き」されるため注意が必要です。

実務で役立つ主要なオプション

teeコマンドには、特定のニーズに応えるための便利なオプションがいくつか用意されています。

既存ファイルに追記する(-aオプション)

デフォルトの上書き動作ではなく、既存のファイル内容を保持したまま末尾にデータを追加したい場合は、-a(append)オプションを使用します。

このオプションは、ログファイルに新しい情報を継続的に書き込んでいきたい場合に非常に重宝します。

Shell
echo "新しいログエントリー" | tee -a app.log
実行結果
新しいログエントリー

-aオプションを忘れてしまうと、それまでの蓄積されたログがすべて消えてしまうため、追記が必要な場面では必ず指定するよう習慣づけることが大切です。

割り込み信号を無視する(-iオプション)

-i(ignore)オプションを使用すると、実行中にCtrl+Cなどの割り込み信号(SIGINT)を受け取っても、コマンドが即座に終了しないように設定できます。

これは、非常に重要なデータの書き込み中に、誤ってプロセスを終了させてファイルが破損するのを防ぎたい場合に有効です。

実践的な活用テクニック

基本的な使い方をマスターしたら、次はより高度な組み合わせ方法を見ていきましょう。

標準エラー出力も同時に保存する方法

デフォルトの状態では、パイプは「標準出力」のみをteeに渡します。

そのため、エラーメッセージ(標準エラー出力)はファイルに保存されず、画面に表示されるだけになってしまいます。

エラーも含めてすべてを記録したい場合は、シェルのリダイレクト機能を使用して標準エラー出力を標準出力に統合する必要があります。

Shell
./my_script.sh 2>&1 | tee all_output.log

上記のコマンドでは、2>&1という記述によってエラー出力を標準出力へ合流させています。

これにより、正常な動作ログとエラーログの両方を一括してファイルに保存しつつ、画面で監視できるようになります。

複数のファイルに同時に書き込む

teeコマンドの引数には、複数のファイル名を指定することが可能です。

これにより、一つのコマンドの実行結果を複数の異なるディレクトリやファイルに一度に保存できます。

Shell
echo "データバックアップ開始" | tee log1.txt log2.txt backup.log

情報の複製を複数の場所に残しておきたいバックアップ作業などで非常に役立つテクニックです。

sudo権限が必要なファイルへの書き込み

システム設定ファイルの編集などで、管理者権限が必要なファイルにリダイレクトで書き込もうとして拒否された経験はないでしょうか。

例えば、sudo echo "setting" > /etc/configというコマンドは、リダイレクト処理自体を現在の一般ユーザーが行おうとするため失敗します。

この問題を回避するためにteeが活用されます。

Shell
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

この方法であれば、teeコマンド自体がsudo権限で動作するため、権限制限のあるファイルに対しても安全に出力を行うことができます。

パイプラインの中間に挿入してデバッグする

複雑な長いパイプラインコマンドを作成している際、途中のステップでどのようなデータが流れているかを確認したいことがあります。

teeをパイプの中間に挟むことで、処理を継続させたまま中間結果をファイルにダンプすることが可能です。

Shell
cat data.csv | grep "target" | tee mid_process.log | sort | uniq

この例では、grepの結果を確認しつつ、最終的なsort | uniqの結果を画面に出力しています。

teeコマンド使用時の注意点と補足

便利に活用できるteeですが、いくつか知っておくべき特性があります。

バッファリングの影響

大量のデータを高速に出力する場合、バッファリングによって画面表示やファイルへの書き込みにわずかな遅延が生じることがあります。

リアルタイム性を極限まで追求する場合は、環境に応じたバッファ設定の調整が必要になるケースもありますが、一般的な利用範囲では問題になることは稀です。

ディスク容量の消費

常駐プログラムやループ処理の中でteeを使用し続けると、ログファイルが肥大化してディスク容量を圧迫する恐れがあります。

「ファイルに保存している」という意識を持ち、定期的なログローテーションや不要なファイルの削除を行うようにしましょう。

teeコマンドのオプション一覧表

よく使われるオプションを以下の表にまとめました。

オプション説明
-a (–append)ファイルを上書きせず、既存の内容の末尾に追記します。
-i (–ignore-interrupts)中断信号(SIGINT)を無視して動作を継続します。
--helpヘルプメッセージを表示して終了します。
--versionバージョン情報を表示して終了します。

まとめ

Bashのteeコマンドは、画面出力とファイル保存を同時に実現する非常にシンプルかつ強力なツールです。

基本的な使い方を覚えるだけで、ログの取得やデバッグ、管理者権限でのファイル操作など、日々のターミナル作業が驚くほどスムーズになります。

特に、「出力を目で追いながら、証跡としてファイルにも残す」という作業は、インフラ運用やプログラム開発において欠かせないプロセスです。

今回ご紹介した-aオプションによる追記や、標準エラー出力の統合などのテクニックを活用して、より効率的なBash操作を実践してみてください。

日々のコマンド操作の中でteeを使いこなすことができれば、トラブルシューティングのスピードも格段に向上するはずです。

URLをコピーしました!