Als Systemadministrator leitest du täglich Ausgaben von Befehlen um, um Logs zu sichern, Fehler zu isolieren oder Skripte zu automatisieren. Umleitungen helfen dir, stdout und stderr gezielt in Dateien zu schreiben, ohne dass der Bildschirm überflutet wird. Sie sind essenziell für effiziente Troubleshooting und Script-Entwicklung in jeder Linux-Umgebung.
Standardausgabe umleiten
Die Standardausgabe (stdout, Dateideskriptor 1) leitest du mit dem Operator > in eine Datei um. Die Shell erstellt die Datei vor dem Befehlsstart, überschreibt bestehende Inhalte und zeigt nichts auf dem Terminal an. Also Achtung, auch wenn eine Datei mit dem selben Namen bereits besteht werden die Inhalte dadurch gelöscht.
ls -la > verzeichnis.txt
Ausgabe anhängen
Mit >> hängst du die stdout an das Ende einer Datei an, statt sie zu überschreiben. Existiert die Datei nicht, wird sie neu angelegt. Das eignet sich ideal für Logdateien, die du kontinuierlich erweiterst.
echo "Neuer Eintrag" >> log.txt
Standardeingabe umleiten
Der Operator < leitet Dateiinhalte als Eingabe (stdin, Deskriptor 0) an ein Kommando weiter, statt Tastatureingaben zu erwarten. Viele Tools wie wc interpretieren Argumente direkt als Dateien, aber für interaktive Programme wie tr ist das nützlich.
# wc -l zählt in diesem Fall die Zeilen der Datei passwd
wc -l < /etc/passwd
Hier-Dokumente nutzen
Hier-Dokumente mit <<(-) übergeben mehrzeiligen Text direkt als stdin an Befehle, ohne temporäre Dateien. Wähle einen Delimiter wie EOF, der den Anfang und das Ende der Eingabe eingrenzt. EOF (= End of File) ist keine Variable oder Befehl, sondern eine beliebige Zeichenkette, die das Ende eines mehrzeiligen Eingabetexts markiert. Also eigentlich eine Konvention. Die Shell liest alle Zeilen bis zur Zeile, die genau mit dem Delimiter beginnt (ohne führende Leerzeichen). Du kannst also auch MEINEINGABE nutzen.
cat << EOF
Zeile 1 mit Variable: $USER
Zeile 2 bleibt unverändert.
EOF
# Nutzung von MEINEEINGABE als Delimiter. Möglich aber lang und umständlich.
cat << MEINEEINGABE
Zeile 1 mit Variable: $USER
Zeile 2 bleibt unverändert.
MEINEEINGABE
Standardfehlerkanal handhaben
Der Standardfehlerkanal (stderr, Deskriptor 2) fängt Fehlermeldungen ab. Im Verhältnis zu stdout und stdin benötigt stderr eine Angabe des Dateidesktritors 2. Im unteren Beispiel leite ihn mit 2> nach /dev/null um, um ihn stummzuschalten, während stdout sichtbar bleibt. /dev/null verwirft alle Daten. /dev/null ist eine Gerätedatei, die alle in sie geschriebenen Daten verwirft.
# Schickt Fehlermeldungen in das "schwarze Loch". Praktisch wenn man z.B. Berechtigungsfehler erwartet sie aber nicht sehen will
ls nichtvorhanden 2> /dev/null
Kombiniere stdout und stderr: Zuerst stdout > datei umleiten, dann 2>&1, damit stderr folgt. Die Fehlermeldungen stderr (2>) werden so nach stdout (1) umgeleitet und somit landen die normalen Ausgaben und die Fehler in einer Datei.
Das & in 2>&1 ist der File Descriptor Duplication Operator und wichtig für die richtige Umleitung. Ohne ihn wird 2>1 als Umleitung zu einer Datei namens „1“ interpretiert.
# Normale Ausgabe und Fehler in seperate Dateien umleiten
ls -la datei.txt 2> fehler.log 1> ausgabe.log
# Alle inhalte (Fehler eingeschlossen) werden umgeleitet
ls -la datei.txt > alles.log 2>&1
# Achtung: Vergessen des & führt dazu, dass Fehler in eine Datei namens "1" umgeleitet werden
ls -la datei.txt > alles.log 2>1
Zusammenfassung
Umleitungen mit >, >>, <, << und Deskriptoren wie 2> kontrollieren Eingabe und Ausgabe präzise, speichern Logs oder filtern Fehler. Übe mit ls und echo, um stdout, stderr und Hier-Dokumente zu meistern; kombiniere sie für robuste Skripte. So hältst du deine Systemadministration sauber und effizient.
Schreibe einen Kommentar