Przepraszam, jeśli to głupie pytanie, ale staram się osiągnąć coś takiego, ale w jednym wierszu:
$ prog1 | prog2
$ prog1 | prog3
Zasadniczo chcę wykonać prog1 i przesłać dane wyjściowe do prog2 i prog3 osobno (nie łańcuchowo). Na początku próbowałem użyć tee, ale to nie wydawało się właściwe, ponieważ zrzucało dane wyjściowe do pliku (co nie jest tym, czego chcę).
$ prog1 | tee prog2 | prog3 # doesn't work - creates file "prog2"
W pewnym momencie prawdopodobnie chciałbym rozszerzyć to na przesyłanie danych wyjściowych do więcej niż dwóch programów, ale na razie zaczynam od prostych.
$ prog1 | prog2
$ prog1 | prog3
$ prog1 | prog4
...
Odpowiedzi:
Zastąpienie procesu.
źródło
Podobnie do odpowiedzi Ignacio, możesz użyć tymczasowego nazwanego potoku za pomocą
mkfifo(1)
.Jest to trochę bardziej szczegółowe, ale działałoby na systemach, które nie mają substytucji procesów, takich jak
dash
. Masleep 1
poradzić sobie w każdych warunkach wyścigowych.źródło
Istnieje mały ptee, który wykonuje zadanie:
Zamiast pisać do plików, ptee zapisuje na wszystkich dyskach fds podanych w wierszu poleceń.
ptee jest częścią pipexec .
źródło
Nie potrzebujesz żadnych bashizmów, specjalnych plików ani żadnego z nich - w każdym razie nie w Linuksie:
Oznacziłem gwiazdką
grep
wyróżnione dla mnie wyniki, aby pokazać, że były to nie tylko trzy wyniki z tego samego strumienia, ale także wynik oddzielnychgrep
dopasowań procesów.źródło