
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 1
dient 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, grep
um zu zeigen, dass es sich nicht nur um drei Ergebnisse aus demselben Stream handelte, sondern auch um das Ergebnis separater grep
Prozessübereinstimmungen.