はじめに
Linux の tee コマンドは、コマンドの出力をターミナルで表示しながら同時にファイルに保存することができる強力なユーティリティです。この機能は、出力をリアルタイムで確認する必要があり、後で分析するために保存する必要もあるシステム管理者や開発者に特に有用です。
この実験 (Lab) では、tee コマンドを使用した出力多重化の基本を紹介します。出力を表示しながら同時に保存する方法、標準エラーをリダイレクトする方法、および出力を既存のファイルに追加する方法を学びます。これらのスキルは、Linux 環境における効果的なログ管理、デバッグ、およびシステム監視に不可欠です。
tee コマンドの基本を理解する
Linux の tee コマンドは、水の流れを二方向に分ける配管の T 字管から名前が付けられました。同様に、tee コマンドはコマンドの出力を二方向に分けます。つまり、ターミナルとファイルに出力します。
まずは作業ディレクトリに移動しましょう。
cd /home/labex/project
テストファイルの作成
まず、実験に使用できる簡単なテキストファイルを作成しましょう。
echo "Hello, World" > hello.txt
このコマンドは、「Hello, World」というテキストが含まれた hello.txt という名前のファイルを作成します。
tee コマンドの使用
では、tee コマンドを使って、hello.txt の内容をターミナルに表示しながら、別のファイルにもコピーしましょう。
cat hello.txt | tee copy.txt
ターミナルには次のような出力が表示されるはずです。
Hello, World
cat hello.txt の部分は hello.txt ファイルの内容を読み取ります。パイプ記号 | はその出力を受け取り、tee コマンドに送ります。そして、tee コマンドはテキストをターミナルに表示すると同時に、copy.txt ファイルに書き込みます。
内容が実際に copy.txt にコピーされたことを確認しましょう。
cat copy.txt
同じ出力が表示されるはずです。
Hello, World
コマンド構造の理解
tee コマンドの基本的な構文は次の通りです。
command | tee filename
ここで、
commandは出力を生成する任意のコマンドです。|(パイプ) はコマンドの出力をteeに送ります。teeはコマンド自体です。filenameは出力が保存されるファイルの名前です。
tee を使った標準エラーのリダイレクト
Linux では、プログラムは 2 つの主要なチャネルを通じて情報を出力することができます。
- 標準出力 (stdout): 通常のプログラム出力
- 標準エラー (stderr): エラーメッセージと診断情報
デフォルトでは、tee コマンドは標準出力のみをキャプチャします。しかし、多くの場合、エラーメッセージもキャプチャしたいことがあります。このような場合に出力のリダイレクトが役立ちます。
標準エラーのリダイレクトの理解
まず、標準出力と標準エラーの両方を出力するスクリプトを作成しましょう。まずはプロジェクトディレクトリに移動します(すでにそこにいない場合)。
cd /home/labex/project
では、標準出力と標準エラーの両方を生成するコマンドを実行しましょう。
echo "This is standard output"
ls /nonexistentfile
次のような出力が表示されるはずです。
This is standard output
ls: cannot access '/nonexistentfile': No such file or directory
ls コマンドからのエラーメッセージが直接ターミナルに表示されることに注意してください。
標準エラーをファイルにリダイレクトする
まず、エラー出力のみをファイルにリダイレクトする方法を見てみましょう。
echo "This is standard output"
ls /nonexistentfile 2> error.log
今回は、次のような出力のみが表示されるはずです。
This is standard output
エラーメッセージは error.log ファイルにリダイレクトされました。2> 構文は、シェルに標準エラー(ファイルディスクリプタ 2)を指定されたファイルにリダイレクトするよう指示します。
error.log の内容を確認しましょう。
cat error.log
次のような出力が表示されるはずです。
ls: cannot access '/nonexistentfile': No such file or directory
tee を使用して出力とエラーの両方をキャプチャする
では、tee を使用して、標準出力と標準エラーの両方をファイルにキャプチャしながら、ターミナルにも表示しましょう。
{
echo "This is standard output"
ls /nonexistentfile
} 2>&1 | tee both.log
ターミナルには出力とエラーの両方が表示されるはずです。
This is standard output
ls: cannot access '/nonexistentfile': No such file or directory
both.log の内容を確認しましょう。
cat both.log
同じ出力が表示されるはずです。
This is standard output
ls: cannot access '/nonexistentfile': No such file or directory
コマンド構造の理解
コマンド 2>&1 | tee both.log では、
{ ... }は複数のコマンドをグループ化します。2>&1は標準エラー(ファイルディスクリプタ 2)を標準出力(ファイルディスクリプタ 1)にリダイレクトします。|は結合された出力をteeコマンドにパイプします。tee both.logは出力をターミナルに表示し、both.logに書き込みます。
この手法は、システムメンテナンスやトラブルシューティング中にコマンドの出力をログに残す際に特に有用です。
tee を使った出力の追記
デフォルトでは、tee コマンドは使用するたびに対象のファイルを上書きします。しかし、多くのシナリオでは、既存のファイルの内容を置き換えるのではなく、新しい情報を追加したいことがあります。このような場合に -a(追加)オプションが便利です。
追加オプションの理解
まだプロジェクトディレクトリにいない場合は、移動しましょう。
cd /home/labex/project
まず、システム情報を含むファイルを作成しましょう。
uname -a | tee system_info.log
このコマンドは、システム情報をターミナルに表示し、system_info.log に保存します。出力は次のようになります(出力は環境によって異なります)。
Linux ubuntu 5.15.0-1031-aws #35-Ubuntu SMP Fri Feb 10 02:14:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
では、ファイルの内容を確認しましょう。
cat system_info.log
同じシステム情報が表示されるはずです。
ファイルに情報を追加する
では、-a オプションを使用して、このファイルにさらに情報を追加しましょう。
echo "Date and time: $(date)" | tee -a system_info.log
これにより、次のような内容が表示されます。
Date and time: Wed May 3 14:22:34 UTC 2023
-a フラグは、tee に対して、出力をファイルに上書きするのではなく追加するよう指示します。
再度、ファイルの内容を確認しましょう。
cat system_info.log
これで、システム情報と日付の両方が表示されるはずです。
Linux ubuntu 5.15.0-1031-aws #35-Ubuntu SMP Fri Feb 10 02:14:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
Date and time: Wed May 3 14:22:34 UTC 2023
さらに情報を追加する
ログファイルにさらに情報を追加しましょう。
echo "Disk usage:" | tee -a system_info.log
df -h | tee -a system_info.log
これにより、ディスク使用状況の情報が表示され、ログファイルに追加されます。出力はシステムによって異なりますが、次のようになるかもしれません。
Disk usage:
Filesystem Size Used Avail Use% Mounted on
/dev/root 19G 5.8G 13G 32% /
tmpfs 494M 0 494M 0% /dev/shm
tmpfs 198M 1.1M 197M 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda15 105M 5.2M 100M 5% /boot/efi
tmpfs 100M 4.0K 100M 1% /run/user/1000
再度、ログファイルの内容を確認しましょう。
cat system_info.log
これで、追加したすべての情報が表示されるはずです。
Linux ubuntu 5.15.0-1031-aws #35-Ubuntu SMP Fri Feb 10 02:14:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
Date and time: Wed May 3 14:22:34 UTC 2023
Disk usage:
Filesystem Size Used Avail Use% Mounted on
/dev/root 19G 5.8G 13G 32% /
tmpfs 494M 0 494M 0% /dev/shm
tmpfs 198M 1.1M 197M 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda15 105M 5.2M 100M 5% /boot/efi
tmpfs 100M 4.0K 100M 1% /run/user/1000
コマンド構造の理解
tee を使用して追加するための構文は次の通りです。
command | tee -a filename
ここで、
commandは出力を生成する任意のコマンドです。|(パイプ)はコマンドの出力をteeに送ります。teeはコマンド自体です。-aは、ファイルを上書きするのではなく追加するためのオプションです。filenameは出力が追加されるファイルの名前です。
このアプローチは、以下の場合に特に有用です。
- 時間の経過とともにログファイルを構築する
- 複数のコマンドの出力を単一のファイルにキャプチャする
- システムの状態や操作の記録を維持する
まとめ
この実験では、Linux で出力の多重化に tee コマンドを使用する方法を学びました。この強力なユーティリティを使用すると、コマンドの出力をターミナルで表示しながら同時にファイルに保存することができるため、システム管理者や開発者にとって不可欠なツールとなっています。
ここで習得した主要なスキルは以下の通りです。
tee の基本的な使い方:
teeを使用して、出力をターミナルに表示しながら同時にファイルに保存する方法を学びました。標準エラーのリダイレクト:
2>&1リダイレクトをteeと組み合わせて、標準出力と標準エラーの両方をキャプチャする方法を習得しました。これは包括的なログ記録に不可欠です。出力の追加:
teeで-aオプションを使用して、既存のファイルに出力を上書きするのではなく追加する方法を学びました。これにより、ログを段階的に構築することができます。
これらの手法は、Linux での様々なタスクに役立ちます。具体的には以下のようなタスクです。
- デバッグ用の詳細なログの作成
- システム活動の監視
- システム管理中のコマンド出力の文書化
- 将来の参照のためにコマンドの結果を保存する
Linux で出力を効果的に管理する方法を理解することは、Linux システムの学習を進める上で基本的なスキルであり、大いに役立つでしょう。



