inuxのコマンドライン操作に慣れてくると、「出力を画面に表示しつつ、ファイルにも保存したい」といった場面に遭遇することがあります。例えば、ログを目で確認しながらファイルに記録したい、あるいは処理結果を確認しながら保存して後から再利用したいといったケースです。
そんな時に便利なのが、teeコマンドです。teeは標準入力を読み込み、その内容を標準出力とファイルの両方に同時に出力することができるユニークなツールです。
この記事では、teeコマンドの基本的な使い方から応用例、オプションの解説まで、わかりやすく丁寧に紹介します。
teeコマンドとは?
teeコマンドは、Unix系OSにおいて、標準入力を読み取り、標準出力に表示しながら、同時にファイルにも書き込むことができるコマンドです。
この名前の由来は、配管のT字型分岐(tee fitting)から来ています。つまり、データの流れを2つに分けるという意味で「tee」と呼ばれています。
基本構文:
コマンド | tee [オプション] ファイル名
ここでの「コマンド」は、標準出力を生成する任意のコマンドです。それをteeで受け取り、標準出力に表示しながらファイルにも出力します。
基本的な使用例
まずは基本的な使い方を見てみましょう。
例1:lsコマンドの出力をファイルに保存しながら表示
ls -l | tee output.txt
このコマンドは、ls -lの出力結果をターミナルに表示しながら、同時にoutput.txtというファイルに書き込みます。
ファイルは新規作成され、すでに存在する場合は上書きされます。
複数ファイルに同時出力する
teeコマンドは、1つの出力を複数ファイルに分けて保存することもできます。
echo "Hello, World!" | tee file1.txt file2.txt
この例では、”Hello, World!” という文字列を標準出力に表示しながら、file1.txtとfile2.txtの両方に同時に出力します。
既存ファイルに追記する(-aオプション)
通常、teeは指定したファイルを上書きします。しかし、既存の内容を残したまま追記したい場合は、-aオプション(または--append)を使用します。
date | tee -a log.txt
このコマンドは、現在の日時をlog.txtに追記しつつ、画面にも表示します。
sudoとteeの組み合わせ
sudoでの書き込みが必要なファイルに対して、リダイレクト(>)ではうまくいかないことがあります。以下の例は失敗するケースです:
echo "test" > /etc/somefile
このような場合、teeを使うことで正しく書き込むことができます。
echo "test" | sudo tee /etc/somefile
この方法なら、sudoの権限がteeに適用されるため、書き込みが許可されていない場所にも安全に出力できます。
teeを使ったログの保存と確認
長時間実行されるスクリプトやコマンドの出力をリアルタイムに確認しつつ、ログとして残すのにteeは非常に便利です。
./long_process.sh | tee process.log
この例では、シェルスクリプトlong_process.shの出力をターミナルに表示しつつ、process.logに記録します。
teeを使って複数段階の処理をつなぐ
teeはパイプラインの途中に組み込むことで、処理の途中経過をファイルに保存することもできます。
cat access.log | grep "404" | tee errors.log | wc -l
この例では、access.logの中から”404″を含む行を抽出して、errors.logに保存。その後、その件数をカウントしています。
/dev/nullと組み合わせる
出力を一時的に捨てたい場合は、/dev/nullと組み合わせることもあります。
some_command | tee /dev/null
このように書くことで、some_commandの出力をすべて無視することができますが、パイプ処理としては成立しているので、他のパイプラインとの連携も可能です。
teeの注意点とポイント
teeはバッファリングされるため、リアルタイム性が完全ではないことがあります(ただし通常の使用ではほとんど気になりません)。- 出力ファイルにエラーやアクセス権限の問題があると、標準出力にエラーメッセージが表示されます。
- 書き込み先ファイルをうっかり指定し間違えると、既存のデータが上書きされるので、追記モード(
-a)の使用を検討しましょう。
まとめ
teeコマンドは、「出力をそのまま見たいし、記録も残したい」といったニーズにぴったりの便利なツールです。標準出力とファイルへの出力を両立できるため、スクリプトのログ記録やデバッグ、システム管理の場面で幅広く使われています。
特にsudoとの組み合わせや-aオプションによる追記モードなど、日常的な作業に役立つテクニックも多くあります。
Linuxでの作業効率を高めたい方は、ぜひteeコマンドを覚えておきましょう。
