はじめに
このチュートリアルでは、Linux の標準ストリームの操作について説明します。特に、標準エラー (stderr) ストリームの理解と管理に焦点を当てています。エラー処理と Linux システムでのロギングに役立つ、stderr 出力をキャプチャして処理するための強力な tee
コマンドの使用方法を学びます。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
このチュートリアルでは、Linux の標準ストリームの操作について説明します。特に、標準エラー (stderr) ストリームの理解と管理に焦点を当てています。エラー処理と Linux システムでのロギングに役立つ、stderr 出力をキャプチャして処理するための強力な tee
コマンドの使用方法を学びます。
Linux は、入出力操作を処理するために 3 つの基本的なストリームを使用します。これらのストリームは、Linux 環境でプログラムがどのように通信するかの基盤を形成します。
Linux 環境でターミナルを開きます。実際の例を通して、標準ストリームの概念を探求します。
標準ストリームは、プログラムとその環境を接続する通信チャネルです。Linux には 3 つの標準ストリームがあります。
いくつかの簡単なコマンドで、これらのストリームがどのように動作するか見てみましょう。
標準入力は、プログラムがデータを受け取る方法であり、通常はキーボード入力から受け取ります。
ターミナルで次のコマンドを入力します。
cat
次に、任意のテキストを入力して Enter キーを押します。cat
コマンドは stdin から読み取り、stdout に出力します。さらに数行のテキストを入力します。
cat
コマンドを終了するには、Ctrl+D (ファイルの終わりを知らせる) を押します。
標準出力は、プログラムが通常の出力を送信する場所です。
次のコマンドを実行します。
echo "This message goes to standard output"
次のように表示されるはずです。
This message goes to standard output
echo
コマンドはテキストを stdout に送信し、それがターミナルに表示されます。
標準エラーは、プログラムがエラーメッセージと警告を送信する場所です。
エラーを生成するために、次のコマンドを実行します。
ls /nonexistent_directory
次のようなエラーメッセージが表示されるはずです。
ls: cannot access '/nonexistent_directory': No such file or directory
このエラーメッセージは stderr に送信されますが、stdout と同様にターミナルに表示されます。
stdout と stderr の違いを確認するために、それらを個別にリダイレクトしてみましょう。
ls /home /nonexistent_directory > output.txt 2> error.txt
次に、各ファイルの内容を調べます。
cat output.txt
cat error.txt
output.txt
に /home
ディレクトリのリストが含まれ、error.txt
に存在しないディレクトリのエラーメッセージが含まれていることがわかるはずです。
これらのストリームがどのように機能するかを理解することは、Linux でプログラムの入出力を制御するために不可欠です。
標準ストリームを理解したところで、これらのストリームを管理するための強力な方法を提供する tee
コマンドについて学びましょう。
Linux の tee
コマンドは、入力を受け取り、それを標準出力と 1 つ以上のファイルに同時に送信します。これは、水を 2 つの方向に送る配管で使用される T 字型の分岐管にちなんで名付けられました。
基本的な例で、tee
がどのように機能するかを見てみましょう。
echo "Hello, tee command" | tee hello.txt
次のように表示されるはずです。
Hello, tee command
このテキストはターミナルに表示され、hello.txt
にも保存されます。ファイルを確認して、これを確かめてください。
cat hello.txt
tee
をプログラムの出力と組み合わせて使用する方法を見てみましょう。
ls -la ~ | tee home_contents.txt
このコマンドは、ホームディレクトリの内容を一覧表示し、画面に表示し、home_contents.txt
に保存します。
デフォルトでは、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
の基本を理解したところで、エラー処理とロギングのためのより高度な使用法を探求しましょう。
場合によっては、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)
この複雑なコマンドは、次のことを行います。
tee stdout.log
にリダイレクトし、画面に表示してファイルに保存しますtee stderr.log >&2
にリダイレクトし、画面に表示してファイルに保存します結果を調べます。
cat stdout.log
cat stderr.log
stdout.log
に通常の出力が表示され、stderr.log
にエラーメッセージが表示されるはずです。
包括的なロギングを行うには、次のようにしたい場合があります。
これを示すスクリプトを作成しましょう。
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)
これにより、次のことが行われます。
error_log.txt
ファイルにキャプチャしますエラーログを確認します。
cat error_log.txt
追跡しやすいように、タイムスタンプ付きのエラーメッセージのみが表示されるはずです。
ファイルのダウンロード、画面への進捗状況の表示、エラーのロギングを行う実用的な例を作成しましょう。
wget https://example.com/nonexistent_file.txt 2> >(tee -a download_errors.log >&2)
このコマンドは、次のことを行います。
download_errors.log
に記録しますエラーログを確認します。
cat download_errors.log
エラーログには、ダウンロードに失敗した試行からのエラーメッセージのみが含まれています。
これらのテクニックを使用すると、標準の Linux コマンドを使用して、洗練されたエラー処理およびロギングシステムを構築できます。
このチュートリアルでは、Linux で標準ストリームを管理するための基本的なテクニックを学びました。特に、tee
コマンドを使用したエラー処理に焦点を当てています。これで、次のことを理解できるようになりました。
tee
コマンドを使用して、出力を画面に表示しながらキャプチャする方法tee
で両方をキャプチャする方法これらのスキルは、堅牢なスクリプトの作成、アプリケーションのトラブルシューティング、および Linux 環境での包括的なログの維持に役立ちます。標準エラー出力を効果的に管理する能力は、より専門的で保守性の高い Linux アプリケーションの開発に役立ちます。