Wenn ich richtig verstehe, sind Sie für das Äquivalent tee file1 file2 file3
, sondern als Schreib die gleichen Daten zu drei Dateien file1
, file2
und file3
, Sie Rohr wollen die gleichen Daten in drei Befehle cmd1
, cmd2
und cmd3
, das heißt
… | ??? cmd1 cmd2 cmd3
sollte gleichbedeutend sein mit
… | cmd1 &
… | cmd2 &
… | cmd3 &
außer das …
würde nur einmal ausgeführt werden.
Dafür gibt es zwei Möglichkeiten.
Ksh93, bash und zsh unterstützen die Prozessersetzung . Dies ist eine Verallgemeinerung von Pipes, die es dem Argument eines Befehls ermöglicht, eine Datei zu sein, in die beim Schreiben Daten als Eingabe an einen Befehl übergeben werden. . Das ist,
echo hello | tee >(cmd1)
druckt hello
auf Standardausgabe und läuft zusätzlich cmd1
mit hello
als Eingabe.
So zum Beispiel, wenn Sie die Eingabe von duplizieren wollen somecommand
und gibt es an beide cmd1
und cmd2
können Sie verwenden
somecommand | tee >(cmd1) | cmd2
Wenn Ihre Shell keine Prozessersetzung unterstützt, können Sie stattdessen Named Pipes verwenden. Siehe Arcege Antwort , wie das funktioniert. Named Pipes sind weniger praktisch als die Prozessersetzung, da Sie sie erstellen und löschen sowie Prozesse manuell starten und synchronisieren müssen. Sie haben den Vorteil, dass sie vollständig portierbar sind, während nicht alle Shells Prozessersetzungen unterstützen. Sie können auch in anderen Szenarien als denen verwendet werden, für die die Prozessersetzung vorgesehen ist.
Unter der Haube werden bei einigen Systemen für die Prozessersetzung intern Named Pipes verwendet. Auf den meisten Systemen werden jedoch benannte Dateien verwendet, die Dateideskriptoren darstellen .