tee
コマンドは、標準入力から受け取ったデータを標準出力に表示すると同時に、
指定したファイルにも書き込むことができるLinuxの便利なコマンドです。
特に、ログファイルの作成やデバッグ時に役立ちます。
基本構文
tee [オプション] [ファイル...]
- 標準入力:
tee
コマンドは、標準入力を受け取ります。 - 標準出力: 処理結果を画面に表示します。
- ファイル: 指定したファイルに出力を保存します。
主なオプション一覧
オプション | 説明 |
---|---|
-a | 既存のファイルに追記します(上書きしません)。 |
-i | 中断シグナル(SIGINT)を無視します。 |
--help | 使用方法を表示します。 |
各オプションの実行例と結果
1. 基本的な使用方法
標準入力の内容を画面に表示しつつ、ファイルに保存します。
コマンド:
echo "Hello, World!" | tee output.txt
結果:
画面にHello, World!
と表示され、output.txt
にも同じ内容が書き込まれます。
解説:
この基本動作では、標準入力の内容がそのまま標準出力とファイルに複製されます。
2. ファイルに追記する(-a
オプション)
既存のファイルに新しい内容を追記します。
コマンド:
echo "New Line" | tee -a output.txt
結果:
ファイルoutput.txt
の末尾にNew Line
が追加されます。
解説::
-a
オプションを使用すると、既存の内容を上書きせずに追記できます。
3. 中断シグナルを無視する(-i
オプション)
SIGINT(通常はCtrl+C
で送信)を無視して処理を継続します。
コマンド:
( sleep 10; echo "Done" ) | tee -i output.txt
結果:
途中でCtrl+C
を押してもコマンドは中断されず、処理が完了します。
解説:
-i
オプションは、重要な処理を中断させたくない場合に便利です。
メモ:サブシェルとは
()
はサブシェルを作成するための構文で、その中で実行されるコマンドは
現在のシェルとは別のプロセスで実行されます。
sleep 10
: 10秒間待機します。echo "Done"
: 待機後にDone
という文字列を出力します。
これをまとめると、以下のような処理が行われます:
- サブシェル内で10秒間待機。
- 待機終了後に「Done」を出力。
実行例:
( sleep 10; echo "Done" )
結果:
10秒後に以下の出力が得られます。
Done
ポイント:
- サブシェルを使うことで、現在のシェル環境を汚さずに一時的な処理を行えます。
4. 複数ファイルへの出力
標準入力を複数のファイルに同時に出力します。
コマンド:
echo "Multiple outputs" | tee file1.txt file2.txt
結果:
- 画面に
Multiple outputs
と表示されます。 file1.txt
とfile2.txt
に同じ内容が書き込まれます。
解説:
複数の出力先が必要な場合に使用します。
実践例
1. ログの保存と画面表示
コマンドの出力を画面に表示しつつ、ログファイルに保存します。
コマンド:
ping -c 4 example.com | tee ping.log
-c 4
:ping
が送信するパケット数を4回に制限します(デフォルトでは無限に実行されます)。
結果:
ping
コマンドの結果が画面に表示され、同時にping.log
ファイルに保存されます。
2. スクリプトのデバッグ
スクリプトの実行結果を画面に表示しながらログファイルに保存します。
コマンド:
{ echo "Starting process"; ls; echo "Process complete"; }| tee process.log
結果:
スクリプトの各出力が画面に表示され、process.log
に記録されます。
解説:
スクリプトの動作確認やログ収集に役立ちます。
メモ:コマンドブロック
{}
はコマンドブロックを作成します。
サブシェルではなく現在のシェル内で複数のコマンドをまとめて実行するために使用します。
echo "Starting process"
: プロセスの開始を示すメッセージを出力。ls
: 現在のディレクトリ内のファイルやディレクトリを一覧表示。echo "Process complete"
: プロセスの完了を示すメッセージを出力。
実行例:
{ echo "Starting process"; ls; echo "Process complete"; }
結果例:
Starting process
file1.txt
file2.txt
directory1
Process complete
ポイント:
()
とは異なり、コマンドは現在のシェルで実行されます。- コマンドの最後に必ず
;
または改行が必要です。
()
と{}
の違い
構文 | 説明 | 主な特徴 |
---|---|---|
() | サブシェルを作成し、その中でコマンドを実行します | サブシェルで実行されるため、現在のシェルの変数や状態に影響を与えません |
{} | 現在のシェル内でコマンドをグループ化して実行します | 現在のシェルの変数や状態に影響を与えます |
まとめ
tee
コマンドは、Linuxにおけるログ作成やデバッグ作業で欠かせないツールです。
以下のような用途で活用できます。
- 標準出力をファイルに保存しつつ内容を確認する。
- 複数の出力先にデータを分配する。
- スクリプトの実行ログを収集する。
適切なオプションを選択して、柔軟に活用しましょう。