🔄 1. Virtuelle Streams mit <(...) und >(...)
Prozess-Substitution verwandelt die Ausgabe eines Befehls in einen temporären Dateideskriptor (/dev/fd/XX). Dadurch können Befehle, die Dateien erwarten, direkt mit Streams arbeiten:
diff -u <(cat remote_host_a.json) <(cat remote_host_b.json)
│ │
â–¼ â–¼
[/dev/fd/63] [/dev/fd/62]
└─────────▶ [ diff ] ◀─────────┘
│ │
â–¼ â–¼
[/dev/fd/63] [/dev/fd/62]
└─────────▶ [ diff ] ◀─────────┘
# 🎯 Dateien ohne Zwischenspeichern vergleichen:
diff -u <(curl -s https://api.a.com/status) <(curl -s https://api.b.com/status)
# 🎯 Gleichzeitig in Datei und Filter-Pipe schreiben:
echo "Incoming Request" | tee >(logger -t "APP") > access.log
🧵 2. Interaktive Co-Prozesse (coproc) & Named Pipes (mkfifo)
Wenn dein Skript mit einem Hintergrundprozess im Ping-Pong-Verfahren Daten austauschen muss, sind Co-Prozesse das mächtigste Werkzeug:
# 🤖 Co-Prozess im Hintergrund starten:
coproc CALC {
while read -r expr; do
[ "$expr" = "QUIT" ] && break
echo "$((expr))"
done
}
# 📤 Senden an coproc:
echo "10 + 20" >&"${CALC[1]}"
# 📥 Empfangen von coproc:
read -r antwort <&"${CALC[0]}"
echo "Ergebnis: $antwort" # 30
📻 Didaktische Analogie: Das Walkie-Talkie für Prozesse
Standard-Pipes (|) sind wie eine Einbahnstraße (Wasserrohr). Ein Co-Prozess ist wie ein Walkie-Talkie mit zwei Kanälen: Kanal 1 (${NAME[1]}) zum Sprechen/Senden und Kanal 0 (${NAME[0]}) zum Hören/Empfangen!
📑 3. Cheat-Sheet: IPC & Prozess-Substitution
| Syntax | Typ | Einsatzzweck |
|---|---|---|
<(cmd) |
Process Substitution (Read) | Befehlsausgabe als virtuelle Datei lesen |
>(cmd) |
Process Substitution (Write) | Datenstrom an Befehlseingabe leiten |
mkfifo /tmp/pipe |
Named Pipe (FIFO) | Dateisystem-Puffer zwischen unabhängigen Skripten |
coproc NAME { ... } |
Co-Prozess | Bidirektionaler Hintergrund-Daemon in Bash |
>&"${NAME[1]}" |
File Descriptor Write | In stdin des Co-Prozesses schreiben |