Wie man 'tee' zur Erfassung von Standardfehlern verwendet

LinuxBeginner
Jetzt üben

Einführung

Dieses Tutorial führt Sie durch die Arbeit mit Linux-Standardstreams, wobei der Schwerpunkt auf dem Verständnis und der Verwaltung des Standardfehlers (stderr) liegt. Sie lernen, wie Sie den leistungsstarken tee-Befehl verwenden, um die stderr-Ausgabe zu erfassen und zu verarbeiten, eine wertvolle Fähigkeit für die Fehlerbehandlung und Protokollierung in Linux-Systemen.

Verständnis der Linux-Standardstreams

Linux verwendet drei grundlegende Streams, um Ein- und Ausgabevorgänge zu verarbeiten. Diese Streams bilden die Grundlage dafür, wie Programme in einer Linux-Umgebung kommunizieren.

Was sind Standardstreams?

Öffnen Sie ein Terminal in Ihrer Linux-Umgebung. Wir werden das Konzept der Standardstreams anhand praktischer Beispiele untersuchen.

Standardstreams sind Kommunikationskanäle, die Programme mit ihrer Umgebung verbinden. Linux hat drei Standardstreams:

  1. Standard Input (stdin) - Filedeskriptor 0
  2. Standard Output (stdout) - Filedeskriptor 1
  3. Standard Error (stderr) - Filedeskriptor 2

Lassen Sie uns diese Streams in Aktion mit einigen einfachen Befehlen sehen.

Demonstration von Standard Input (stdin)

Standard Input ist die Art und Weise, wie Programme Daten empfangen, typischerweise von der Tastatureingabe.

Geben Sie den folgenden Befehl in Ihrem Terminal ein:

cat

Geben Sie nun beliebigen Text ein und drücken Sie die Eingabetaste. Der Befehl cat liest von stdin und gibt ihn nach stdout aus. Geben Sie ein paar weitere Textzeilen ein.

Um den Befehl cat zu beenden, drücken Sie Strg+D (was das Dateiende signalisiert).

Demonstration von Standard Output (stdout)

Standard Output ist der Ort, an den Programme ihre normale Ausgabe senden.

Führen Sie diesen Befehl aus:

echo "This message goes to standard output"

Sie sollten sehen:

This message goes to standard output

Der Befehl echo sendet den Text an stdout, der auf Ihrem Terminal angezeigt wird.

Demonstration von Standard Error (stderr)

Standard Error ist der Ort, an den Programme Fehlermeldungen und Warnungen senden.

Führen Sie diesen Befehl aus, um einen Fehler zu generieren:

ls /nonexistent_directory

Sie sollten eine Fehlermeldung ähnlich der folgenden sehen:

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

Diese Fehlermeldung wird an stderr gesendet, erscheint aber auf Ihrem Terminal genauso wie stdout.

Unterscheidung zwischen stdout und stderr

Um den Unterschied zwischen stdout und stderr zu sehen, lassen Sie uns diese separat umleiten:

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

Untersuchen Sie nun den Inhalt jeder Datei:

cat output.txt
cat error.txt

Sie sollten sehen, dass output.txt die Auflistung des Verzeichnisses /home enthält, während error.txt die Fehlermeldung für das nicht existierende Verzeichnis enthält.

Das Verständnis der Funktionsweise dieser Streams ist entscheidend für die Steuerung der Programmein- und -ausgabe in Linux.

Einführung in den tee-Befehl

Nachdem Sie die Standardstreams verstanden haben, lernen wir nun den tee-Befehl kennen, der eine leistungsstarke Möglichkeit zur Verwaltung dieser Streams bietet.

Was ist der tee-Befehl?

Der tee-Befehl in Linux nimmt Eingaben entgegen und sendet sie gleichzeitig an die Standardausgabe und eine oder mehrere Dateien. Er ist nach dem T-Verteiler benannt, der in der Sanitärtechnik verwendet wird, um Wasser in zwei Richtungen zu leiten.

Lassen Sie uns anhand eines einfachen Beispiels untersuchen, wie tee funktioniert:

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

Sie sollten sehen:

Hello, tee command

Dieser Text erscheint auf Ihrem Terminal und wird auch in hello.txt gespeichert. Bestätigen Sie dies, indem Sie die Datei überprüfen:

cat hello.txt

Kombinieren von tee mit Standard Output

Sehen wir uns an, wie wir tee mit der Programmausgabe verwenden können:

ls -la ~ | tee home_contents.txt

Dieser Befehl listet den Inhalt Ihres Home-Verzeichnisses auf, zeigt ihn auf dem Bildschirm an und speichert ihn in home_contents.txt.

Grundlegende Fehlerbehandlung mit tee

Standardmäßig erfasst tee nur die Standardausgabe. Um auch den Standardfehler zu erfassen, müssen wir zuerst stderr nach stdout umleiten.

Probieren Sie dieses Beispiel aus:

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

Der Teil 2>&1 leitet stderr (Filedeskriptor 2) nach stdout (Filedeskriptor 1) um und kombiniert beide Streams. Der tee-Befehl erfasst dann diese kombinierte Ausgabe.

Untersuchen Sie den Inhalt der Datei:

cat mixed_output.txt

Sie sollten sowohl die Verzeichnisauflistung als auch die Fehlermeldung in der Datei sehen.

Anhängen von Ausgaben anstelle von Überschreiben

Wenn Sie an eine Datei anhängen möchten, anstatt sie zu überschreiben, verwenden Sie die Option -a:

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

Überprüfen Sie den Inhalt:

cat log.txt

Sie sollten beide Zeilen in der Datei sehen, da der zweite Befehl an die Datei angehängt und sie nicht überschrieben hat.

Erweiterte Fehlerbehandlung mit tee

Nachdem Sie die Grundlagen von tee verstanden haben, wollen wir nun fortgeschrittenere Anwendungen für die Fehlerbehandlung und Protokollierung untersuchen.

Trennung von Standard Output und Standard Error

Manchmal möchten Sie stdout und stderr separat erfassen, während Sie beide weiterhin auf dem Terminal anzeigen. Erstellen wir ein Skript, das beide Arten von Ausgaben generiert:

nano test_script.sh

Fügen Sie dem Skript den folgenden Inhalt hinzu:

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

Speichern Sie die Datei (drücken Sie Strg+O und dann Eingabe) und beenden Sie sie (drücken Sie Strg+X).

Machen Sie das Skript ausführbar:

chmod +x test_script.sh

Führen Sie nun das Skript aus, wobei sowohl stdout als auch stderr separat erfasst werden:

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

Dieser komplexe Befehl:

  1. Führt Ihr Skript aus
  2. Leitet stdout an tee stdout.log um, wodurch es auf dem Bildschirm angezeigt und in einer Datei gespeichert wird
  3. Leitet stderr an tee stderr.log >&2 um, wodurch es auf dem Bildschirm angezeigt und in einer Datei gespeichert wird

Untersuchen Sie die Ergebnisse:

cat stdout.log
cat stderr.log

Sie sollten reguläre Ausgaben in stdout.log und Fehlermeldungen in stderr.log sehen.

Erstellen eines vollständigen Fehlerprotokolls

Für eine umfassende Protokollierung möchten Sie möglicherweise:

  1. Normale Ausgaben auf dem Bildschirm anzeigen
  2. Fehler sowohl auf dem Bildschirm als auch in einer Protokolldatei anzeigen
  3. Die Fehler mit Zeitstempeln versehen, um die Nachverfolgung zu erleichtern

Erstellen wir ein Skript, um dies zu demonstrieren:

nano logging_script.sh

Fügen Sie den folgenden Inhalt hinzu:

#!/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"

Speichern Sie das Skript und machen Sie es ausführbar:

chmod +x logging_script.sh

Führen Sie es nun mit Fehlerprotokollierung aus:

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

Dies bewirkt Folgendes:

  1. Alle Ausgaben (sowohl stdout als auch stderr) werden auf dem Bildschirm angezeigt
  2. Zusätzlich wird stderr in der Datei error_log.txt erfasst

Überprüfen Sie das Fehlerprotokoll:

cat error_log.txt

Sie sollten nur die Fehlermeldungen mit Zeitstempeln sehen, wodurch sie leicht nachverfolgt werden können.

Anwendung in der Praxis: Befehl mit Fortschritt und Fehlerbehandlung

Erstellen wir ein praktisches Beispiel, das eine Datei herunterlädt und den Fortschritt auf dem Bildschirm anzeigt, während Fehler protokolliert werden:

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

Dieser Befehl:

  1. Versucht, eine Datei herunterzuladen, die nicht existiert
  2. Zeigt alle Ausgaben auf dem Bildschirm an, einschließlich Fortschritt und Fehler
  3. Protokolliert zusätzlich alle Fehler in download_errors.log

Überprüfen Sie das Fehlerprotokoll:

cat download_errors.log

Das Fehlerprotokoll enthält nur die Fehlermeldungen vom fehlgeschlagenen Download-Versuch.

Mit diesen Techniken können Sie mithilfe von Standard-Linux-Befehlen ausgefeilte Fehlerbehandlungs- und Protokollierungssysteme erstellen.

Zusammenfassung

In diesem Tutorial haben Sie wichtige Techniken zur Verwaltung von Standardstreams in Linux gelernt, mit Schwerpunkt auf der Fehlerbehandlung mithilfe des tee-Befehls. Sie verstehen jetzt:

  • Die drei Standardstreams in Linux: stdin, stdout und stderr
  • Wie man den tee-Befehl verwendet, um Ausgaben zu erfassen und gleichzeitig auf dem Bildschirm anzuzeigen
  • Wie man stderr nach stdout umleitet und beides mit tee erfasst
  • Erweiterte Techniken zum Trennen und Protokollieren verschiedener Ausgabestreams
  • Wie man eine praktische Fehlerprotokollierung in realen Szenarien implementiert

Diese Fähigkeiten sind wertvoll für die Erstellung robuster Skripte, die Fehlerbehebung in Anwendungen und die Pflege umfassender Protokolle in Linux-Umgebungen. Die Fähigkeit, die Standardfehlerausgabe effektiv zu verwalten, hilft Ihnen dabei, professionellere und wartungsfreundlichere Linux-Anwendungen zu entwickeln.