Jeśli dobrze rozumiem, szukasz ekwiwalentu tee file1 file2 file3
, ale zamiast zapisywać te same dane w trzech plikach file1
, file2
i file3
chcesz połączyć te same dane w trzy polecenia cmd1
, cmd2
i cmd3
, tj.
… | ??? cmd1 cmd2 cmd3
powinno być równoważne z
… | cmd1 &
… | cmd2 &
… | cmd3 &
z wyjątkiem tego, …
że wykonano by to tylko raz.
Można to zrobić na dwa sposoby.
Ksh93, podstawianie procesów bash i zsh . Jest to uogólnienie potoków, które pozwala argumentowi polecenia być plikiem, który po zapisaniu przekazuje dane jako dane wejściowe do polecenia (istnieje również wariant wejściowy, który po odczytaniu uzyskuje dane wyjściowe polecenia) . To jest,
echo hello | tee >(cmd1)
drukuje hello
na standardowe wyjście, a ponadto prowadzi cmd1
ze hello
jako wejście.
Na przykład, jeśli chcesz powielić dane wejściowe somecommand
i przekazać je do obu cmd1
i cmd2
, możesz użyć
somecommand | tee >(cmd1) | cmd2
Jeśli twoja powłoka nie obsługuje zastępowania procesów, możesz zamiast tego użyć nazwanych potoków. Zobacz odpowiedź Arcege, aby dowiedzieć się, jak to działa. Nazwane potoki są mniej wygodne niż podstawianie procesów, ponieważ musisz je utworzyć i usunąć, a także ręcznie uruchomić i zsynchronizować procesy. Mają tę zaletę, że są w pełni przenośne, podczas gdy nie wszystkie powłoki obsługują zastępowanie procesów. Mogą być również używane w scenariuszach innych niż te, dla których proces jest zastępowany.
Pod niektórymi systemami pod maską proces zamiany używa nazwanych potoków wewnętrznie. Jednak w większości systemów korzysta z nazwanych plików reprezentujących deskryptory plików .