Anleitung: Pipes in der Bash zur Verkettung von Befehlen verwenden
December 15, 2015
Der Pipe-Operator (|) ist eines der mächtigsten Konzepte der Unix-Philosophie. Er ermöglicht es, einfache, spezialisierte Kommandozeilen-Werkzeuge zu komplexen Verarbeitungsketten zu verknüpfen, indem er die Standardausgabe (stdout) eines Befehls direkt als Standardeingabe (stdin) für den nächsten Befehl weiterleitet.
1. Grundlegende Funktionsweise
Syntax: befehl1 | befehl2
befehl1wird ausgeführt.- Alles, was
befehl1aufstdoutschreibt, wird nicht im Terminal angezeigt, sondern... - ...direkt an
stdinvonbefehl2übergeben. - Nur die Ausgabe von
befehl2erscheint im Terminal.
Beispiel: Prozesse filtern
# `ps aux` listet alle laufenden Prozesse auf.
# `grep "nginx"` filtert diese Liste und gibt nur Zeilen aus, die "nginx" enthalten.
ps aux | grep "nginx"

2. Verkettung mehrerer Befehle (Pipelines)
Mehrere Pipes können aneinandergereiht werden, um komplexe Daten-Workflows zu erstellen.
# 1. Listet alle Prozesse.
# 2. Filtert nach "nginx".
# 3. `grep -v "grep"` entfernt die Zeile, die den grep-Befehl selbst enthält.
# 4. `awk '{print $2}'` extrahiert die zweite Spalte (die Prozess-ID).
ps aux | grep "nginx" | grep -v "grep" | awk '{print $2}'

3. Kombination mit tee: Ausgabe anzeigen und speichern
Der tee-Befehl liest von stdin und schreibt den Inhalt sowohl nach stdout (zur Anzeige im Terminal) als auch in eine oder mehrere Dateien.
# Zeigt die Kernel-Meldungen an UND speichert sie gleichzeitig in 'dmesg.log'
dmesg | tee dmesg.log
4. Wichtige Sicherheitshinweise
curl URL | bash
Seien Sie extrem vorsichtig mit Befehlen, die ein Skript aus dem Internet herunterladen und direkt an eine Shell weiterleiten.
# POTENZIELL GEFÄHRLICH!
curl -sSL https://example.com/install.sh | sudo bash
Dies führt den Code ungeprüft mit Root-Rechten aus. Ein Angreifer könnte den Inhalt des Skripts manipulieren.
Sichere Alternative:
# 1. Herunterladen
curl -o install.sh https://example.com/install.sh
# 2. Überprüfen
less install.sh
# 3. Ausführen
bash install.sh
Fehler in Pipelines (set -o pipefail)
Standardmäßig gibt eine Pipeline den Exit-Code des letzten Befehls zurück. Wenn ein früherer Befehl fehlschlägt, läuft die Kette trotzdem weiter. Um dies zu verhindern, verwenden Sie set -o pipefail am Anfang Ihres Skripts.
set -o pipefail
# Jetzt bricht die gesamte Pipeline ab, wenn ein Befehl darin fehlschlägt.
false | echo "Dieser Teil wird nicht erreicht."
Fazit
Pipes sind das Herzstück der Kommandozeilen-Effizienz in Unix-Systemen. Sie ermöglichen es, einfache Werkzeuge modular zu kombinieren, um komplexe Aufgaben zu lösen, ohne temporäre Dateien erstellen zu müssen.