'tee' コマンドで標準エラーをキャプチャする方法

LinuxLinuxBeginner
オンラインで実践に進む

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

このチュートリアルでは、Linux の標準ストリームの操作について説明します。特に、標準エラー (stderr) ストリームの理解と管理に焦点を当てています。エラー処理と Linux システムでのロギングに役立つ、stderr 出力をキャプチャして処理するための強力な tee コマンドの使用方法を学びます。

Linux 標準ストリームの理解

Linux は、入出力操作を処理するために 3 つの基本的なストリームを使用します。これらのストリームは、Linux 環境でプログラムがどのように通信するかの基盤を形成します。

標準ストリームとは?

Linux 環境でターミナルを開きます。実際の例を通して、標準ストリームの概念を探求します。

標準ストリームは、プログラムとその環境を接続する通信チャネルです。Linux には 3 つの標準ストリームがあります。

  1. 標準入力 (stdin) - ファイル記述子 0
  2. 標準出力 (stdout) - ファイル記述子 1
  3. 標準エラー (stderr) - ファイル記述子 2

いくつかの簡単なコマンドで、これらのストリームがどのように動作するか見てみましょう。

標準入力 (stdin) のデモンストレーション

標準入力は、プログラムがデータを受け取る方法であり、通常はキーボード入力から受け取ります。

ターミナルで次のコマンドを入力します。

cat

次に、任意のテキストを入力して Enter キーを押します。cat コマンドは stdin から読み取り、stdout に出力します。さらに数行のテキストを入力します。

cat コマンドを終了するには、Ctrl+D (ファイルの終わりを知らせる) を押します。

標準出力 (stdout) のデモンストレーション

標準出力は、プログラムが通常の出力を送信する場所です。

次のコマンドを実行します。

echo "This message goes to standard output"

次のように表示されるはずです。

This message goes to standard output

echo コマンドはテキストを stdout に送信し、それがターミナルに表示されます。

標準エラー (stderr) のデモンストレーション

標準エラーは、プログラムがエラーメッセージと警告を送信する場所です。

エラーを生成するために、次のコマンドを実行します。

ls /nonexistent_directory

次のようなエラーメッセージが表示されるはずです。

ls: cannot access '/nonexistent_directory': No such file or directory

このエラーメッセージは stderr に送信されますが、stdout と同様にターミナルに表示されます。

stdout と stderr の区別

stdout と stderr の違いを確認するために、それらを個別にリダイレクトしてみましょう。

ls /home /nonexistent_directory > output.txt 2> error.txt

次に、各ファイルの内容を調べます。

cat output.txt
cat error.txt

output.txt/home ディレクトリのリストが含まれ、error.txt に存在しないディレクトリのエラーメッセージが含まれていることがわかるはずです。

これらのストリームがどのように機能するかを理解することは、Linux でプログラムの入出力を制御するために不可欠です。

tee コマンドの紹介

標準ストリームを理解したところで、これらのストリームを管理するための強力な方法を提供する tee コマンドについて学びましょう。

tee コマンドとは?

Linux の tee コマンドは、入力を受け取り、それを標準出力と 1 つ以上のファイルに同時に送信します。これは、水を 2 つの方向に送る配管で使用される T 字型の分岐管にちなんで名付けられました。

基本的な例で、tee がどのように機能するかを見てみましょう。

echo "Hello, tee command" | tee hello.txt

次のように表示されるはずです。

Hello, tee command

このテキストはターミナルに表示され、hello.txt にも保存されます。ファイルを確認して、これを確かめてください。

cat hello.txt

tee と標準出力の組み合わせ

tee をプログラムの出力と組み合わせて使用する方法を見てみましょう。

ls -la ~ | tee home_contents.txt

このコマンドは、ホームディレクトリの内容を一覧表示し、画面に表示し、home_contents.txt に保存します。

tee を使用した基本的なエラー処理

デフォルトでは、tee は標準出力のみをキャプチャします。標準エラーもキャプチャするには、最初に stderr を stdout にリダイレクトする必要があります。

次の例を試してください。

ls /home /nonexistent_directory 2>&1 | tee mixed_output.txt

2>&1 の部分は、stderr (ファイル記述子 2) を stdout (ファイル記述子 1) にリダイレクトし、両方のストリームを結合します。次に、tee コマンドはこの結合された出力をキャプチャします。

ファイルの内容を調べます。

cat mixed_output.txt

ファイルには、ディレクトリリストとエラーメッセージの両方が表示されるはずです。

上書きではなく出力を追加する

ファイルを上書きするのではなく、ファイルに追加する場合は、-a オプションを使用します。

echo "First line" | tee log.txt
echo "Second line" | tee -a log.txt

内容を確認します。

cat log.txt

2 番目のコマンドがファイルを上書きするのではなく、ファイルに追加したため、ファイルには両方の行が表示されるはずです。

tee を使用した高度なエラー処理

tee の基本を理解したところで、エラー処理とロギングのためのより高度な使用法を探求しましょう。

標準出力と標準エラーの分離

場合によっては、stdout と stderr を個別にキャプチャしながら、両方をターミナルに表示したいことがあります。両方のタイプの出力を生成するスクリプトを作成しましょう。

nano test_script.sh

スクリプトに次の内容を追加します。

#!/bin/bash
echo "This is standard output"
echo "This is standard error" >&2
ls /home
ls /nonexistent_directory

ファイルを保存し (Ctrl+O を押し、Enter キーを押します)、終了します (Ctrl+X を押します)。

スクリプトを実行可能にします。

chmod +x test_script.sh

次に、stdout と stderr の両方を個別にキャプチャしてスクリプトを実行します。

./test_script.sh > >(tee stdout.log) 2> >(tee stderr.log >&2)

この複雑なコマンドは、次のことを行います。

  1. スクリプトを実行します
  2. stdout を tee stdout.log にリダイレクトし、画面に表示してファイルに保存します
  3. stderr を tee stderr.log >&2 にリダイレクトし、画面に表示してファイルに保存します

結果を調べます。

cat stdout.log
cat stderr.log

stdout.log に通常の出力が表示され、stderr.log にエラーメッセージが表示されるはずです。

完全なエラーログの作成

包括的なロギングを行うには、次のようにしたい場合があります。

  1. 通常の出力を画面に送信する
  2. エラーを画面とログファイルの両方に送信する
  3. 追跡を容易にするために、エラーにタイムスタンプを付ける

これを示すスクリプトを作成しましょう。

nano logging_script.sh

次の内容を追加します。

#!/bin/bash

## Function to generate a timestamp
timestamp() {
  date +"%Y-%m-%d %H:%M:%S"
}

## Echo with timestamp to stderr
echo_error() {
  echo "$(timestamp) - ERROR: $1" >&2
}

## Normal output
echo "Starting the script"

## Error output
echo_error "Something went wrong"

## More normal output
echo "Script continuing despite the error"

## Another error
echo_error "Another issue occurred"

## Final output
echo "Script completed"

スクリプトを保存し、実行可能にします。

chmod +x logging_script.sh

次に、エラーロギングで実行します。

./logging_script.sh 2> >(tee -a error_log.txt >&2)

これにより、次のことが行われます。

  1. すべての出力 (stdout と stderr の両方) を画面に表示します
  2. さらに、stderr を error_log.txt ファイルにキャプチャします

エラーログを確認します。

cat error_log.txt

追跡しやすいように、タイムスタンプ付きのエラーメッセージのみが表示されるはずです。

実際のアプリケーション:進捗状況とエラー処理を伴うコマンド

ファイルのダウンロード、画面への進捗状況の表示、エラーのロギングを行う実用的な例を作成しましょう。

wget https://example.com/nonexistent_file.txt 2> >(tee -a download_errors.log >&2)

このコマンドは、次のことを行います。

  1. 存在しないファイルのダウンロードを試みます
  2. 進捗状況やエラーなど、すべての出力を画面に表示します
  3. さらに、エラーを download_errors.log に記録します

エラーログを確認します。

cat download_errors.log

エラーログには、ダウンロードに失敗した試行からのエラーメッセージのみが含まれています。

これらのテクニックを使用すると、標準の Linux コマンドを使用して、洗練されたエラー処理およびロギングシステムを構築できます。

まとめ

このチュートリアルでは、Linux で標準ストリームを管理するための基本的なテクニックを学びました。特に、tee コマンドを使用したエラー処理に焦点を当てています。これで、次のことを理解できるようになりました。

  • Linux の 3 つの標準ストリーム:stdin、stdout、および stderr
  • tee コマンドを使用して、出力を画面に表示しながらキャプチャする方法
  • stderr を stdout にリダイレクトし、tee で両方をキャプチャする方法
  • さまざまな出力ストリームを分離してログに記録するための高度なテクニック
  • 実際のシナリオで実用的なエラーロギングを実装する方法

これらのスキルは、堅牢なスクリプトの作成、アプリケーションのトラブルシューティング、および Linux 環境での包括的なログの維持に役立ちます。標準エラー出力を効果的に管理する能力は、より専門的で保守性の高い Linux アプリケーションの開発に役立ちます。