Es tut mir leid, wenn dies 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 leiten (keine verkettete Pipe). Zuerst habe ich versucht, tee zu verwenden, aber das schien nicht richtig zu sein, weil die Ausgabe in eine Datei geschrieben wurde (was nicht das ist, was ich will).
$ prog1 | tee prog2 | prog3 # doesn't work - creates file "prog2"
Irgendwann möchte ich wahrscheinlich die Ausgabe auf mehr als zwei Programme ausdehnen, aber ich fange gerade erst einfach an.
$ prog1 | prog2
$ prog1 | prog3
$ prog1 | prog4
...
Antworten:
Prozessersetzung.
quelle
Ähnlich wie bei Ignacio können Sie mit eine temporäre Named Pipe verwenden
mkfifo(1)
.Es ist etwas ausführlicher, aber es funktioniert auf Systemen, die keine Prozessersetzung haben, wie z
dash
. Diesleep 1
ist auf eventuelle Rennbedingungen einzustellen.quelle
Es ist ein kleines Programm PTEE , die die Arbeit erledigt:
Anstatt in Dateien zu schreiben, schreibt ptee in alle fds, die in der Kommandozeile angegeben sind.
ptee ist ein Teil von pipexec .
quelle
Sie brauchen keine Bashismen, keine speziellen Dateien oder ähnliches - unter Linux sowieso nicht:
Ich habe die hervorgehobenen Ergebnisse mit einem Stern
grep
markiert, um zu zeigen, dass es sich nicht nur um drei Ergebnisse aus demselben Stream handelt, sondern auch um Ergebnisse einzelnergrep
Prozess-Übereinstimmungen.quelle