Gibt es eine Möglichkeit, die Ausgabe eines Programms an zwei andere Programme weiterzuleiten?

Gibt es eine Möglichkeit, die Ausgabe eines Programms an zwei andere Programme weiterzuleiten?

Entschuldigen Sie, wenn das eine dumme Frage ist, aber ich versuche, so etwas in einer Zeile zu erreichen:

$ prog1 | prog2
$ prog1 | prog3

Ich möchte also grundsätzlich prog1 ausführen und die Ausgabe separat an prog2 und prog3 weiterleiten (keine verkettete Pipe). Zuerst habe ich versucht, tee zu verwenden, aber das schien nicht richtig, da die Ausgabe in eine Datei geschrieben wurde (was ich nicht möchte).

$ prog1 | tee prog2 | prog3 # doesn't work - creates file "prog2"

Irgendwann möchte ich dies wahrscheinlich erweitern, um die Ausgabe an mehr als zwei Programme weiterzuleiten, aber im Moment fange ich erst einmal ganz einfach an.

$ prog1 | prog2
$ prog1 | prog3
$ prog1 | prog4
...

Antwort1

Prozesssubstitution.

... | tee >(prog2) | ...

Antwort2

Ähnlich wie in Ignacios Antwort könnten Sie eine temporäre benannte Pipe verwenden mkfifo(1).

mkfifo /tmp/teedoff.$$; cmd | tee /tmp/teedoff.$$ | prog2 & sleep 1; prog3 < /tmp/teedoff.$$; rm /tmp/teedoff.$$

Es ist etwas ausführlicher, würde aber auf Systemen funktionieren, die keine Prozesssubstitution haben, wie z dash. B. . Dies sleep 1dient zur Handhabung etwaiger Race Conditions.

Antwort3

Es gibt ein kleines Dienstprogrammpteedas den Job macht:

prog1 | ptee 2 3 4 2> >(prog2) 3> >(prog3) 4> >(prog4)

Anstatt in Dateien zu schreiben,pteeschreibt in alle FDS, die in der Kommandozeile angegeben sind.

pteeist ein Teil vonPipexec - Übersetzung.

Antwort4

Sie benötigen keine Bashismen oder speziellen Dateien oder dergleichen – zumindest nicht unter Linux:

% { prog1 | tee /dev/fd/3 | prog2 >&2 ; } 3>&1 | prog3 

{ { printf %s\\t%s\\t%s\\n \
    "this uneven argument list" \
    "will wrap around" to \
    "different combinations" \
    "for each line." "Ill pick out" \
    "a few words" "and grep for them from" \
    "the same stream." | 
 tee /dev/fd/3 /dev/fd/4 | 
 grep combination >&2 ; } 3>&1 |
 grep pick >&2 ; } 4>&1 | 
 grep line

different combinations  for each *line.*  Ill pick out
different combinations  for each line.  Ill *pick* out
different *combinations*  for each line.  Ill pick out

Ich habe die für mich hervorgehobenen Ergebnisse mit einem Sternchen markiert, grepum zu zeigen, dass es sich nicht nur um drei Ergebnisse aus demselben Stream handelte, sondern auch um das Ergebnis separater grepProzessübereinstimmungen.

verwandte Informationen