Ich habe zwei (UNIX) Programme A und B, die lesen und schreiben von stdin/stdout.Verbinden der Eingabe _and_output zwischen zwei Befehlen in der Shell/Bash
Mein erstes Problem ist, wie man die Stdout von A an stdin von B und die Stdout von B an die stdin von A. Ie., etwas wie A | B aber ein bidirektionales Rohr. Ich vermute, dass ich das durch using exec to redirect lösen konnte, aber ich konnte es nicht zur Arbeit bringen. Die Programme sind interaktiv, so dass eine temporäre Datei nicht funktioniert. Das zweite Problem ist, dass ich jede Richtung duplizieren und ein Duplikat über ein Logging-Programm an stdout leiten möchte, so dass ich den (textlinienbasierten) Datenverkehr sehen kann, der zwischen den Programmen passiert. Hier kann ich mit Abschlag> (...) davonkommen, wenn ich das erste Problem lösen kann.
Beide Probleme scheinen, als hätten sie bekannte Lösungen, aber ich habe nichts gefunden.
Ich würde eine POSIX-Shell-Lösung bevorzugen, oder zumindest etwas, das in bash auf Cygwin funktioniert.
Dank Ihrer Antworten habe ich die folgende Lösung gefunden. Die A/B-Befehle verwenden nc, um zwei Ports zu hören. Das Protokollierungsprogramm verwendet sed (mit -u für ungepufferte Verarbeitung).
bash-3.2$ fifodir=$(mktemp -d)
bash-3.2$ mkfifo "$fifodir/echoAtoB"
bash-3.2$ mkfifo "$fifodir/echoBtoA"
bash-3.2$ sed -u 's/^/A->B: /' "$fifodir/echoAtoB" &
bash-3.2$ sed -u 's/^/B->A: /' "$fifodir/echoBtoA" &
bash-3.2$ mkfifo "$fifodir/loopback"
bash-3.2$ nc -l -p 47002 < "$fifodir/loopback" \
| tee "$fifodir/echoAtoB" \
| nc -l -p 47001 \
| tee "$fifodir/echoBtoA" > "$fifodir/loopback"
Dies überwacht die Verbindung zu Port 47001 und 47002 und echo allen Verkehr auf Standard-Ausgabe.
In Schale 2 tun:
bash-3.2$ nc localhost 47001
In Schale 3 tun:
bash-3.2$ nc localhost 47002
Nun Leitungen 2 in der Schale eingegeben wird geschrieben werden 3 und vice versa Schale und der Verkehr angemeldet 1 Schale , so etwas wie:
B->A: input to port 47001
A->B: input to port 47002
Die oben auf Cygwin wurde
getestetUpdate: Das obige Skript funktioniert nach ein paar Tagen (!) Nicht mehr. Anscheinend kann es zum Stillstand kommen. Einige der Vorschläge in den Antworten können zuverlässiger sein.
mkfifo pipe
gawk '$1' < pipe | gawk '$1' > pipe
TwinPipe kommt auch mit einem Shell-Skript, das die Named Pipe Ansatz von anderen vorgeschlagen verwendet. Danke –