
Manchmal möchte ich etwas in eine Pipeline einfügen, um Berichte zu erstellen oder eine andere sekundäre Verwendung zu ermöglichen. Es kann etwas so Einfaches wie sein wc -l
oder ein komplexeres Biest wie awk
oder sogar ein Python-Skript. Es wäre schön, eine Pipeline wie diese auszuführen:
zcat my_data_file.gz \
| wc -l > /tmp/linecount
| process_data.py
Das Problem besteht darin, dass die meisten Dienstprogramme die Daten nicht auf stdout schreiben. tee
Ich kann die Daten in eine temporäre Datei schreiben, muss dann aber warten, bis alles fertig ist:
zcat my_data_file.gz \
| tee /tmp/f \
| process_data.py && \
wc -l /tmp/f > /tmp/linecount && rm /tmp/f
Dies ist nicht optimal: Es kann sich um eine Pipeline mit sehr langer Laufzeit handeln; ich möchte möglicherweise Zwischenergebnisse des Analogons wc
früher sehen; und ich möchte möglicherweise nicht alle Daten in einer temporären Datei speichern.
Antwort1
Hierzu können Sie tee
Substitutionen einsetzen und verarbeiten :>(...)
zcat my_data_file.gz |
# Count number of lines in stream
tee >(wc -l > /tmp/linecount) |
# Further processing
process_data.py
Beachten Sie, dass Pipes zur Zeilenfortsetzung verwendet werden können und dass Kommentare zwischen Befehlen eingefügt werden können, eine nette Funktion beim Erstellen komplizierter Pipelines.
Antwort2
Es ist nicht ganz effizient, aber Sie können dies erreichen mitBenannte Pipes, die Sie erstellen können mitmkififo(1)
Zum Beispiel in der Frage:
mkfifo /tmp/f
wc -l /tmp/f > /tmp/linecount &
zcat my_data_file.gz \
| tee /tmp/f \
| process_data.py &
wait
rm /tmp/f
Beachten Sie die &
an beide und die Pipeline angehängten Befehle wc
. Dies bedeutet, dass die Shell die Aufgaben in den Hintergrund verschiebt. Der Aufruf von wait
wartet dann, bis alle Hintergrundaufgaben abgeschlossen sind. Beide Prozesse werden ungefähr zur gleichen Zeit beendet.
Bedenken Sie, dass, wenn einer Ihrer Prozesse wesentlich langsamer ist, dies das Ganze erheblich verlangsamen kann, da es tee
entweder zu einer Blockierung seiner Standardausgabe-Pipe oder der benannten Pipe, in die er schreibt, kommen kann.Bearbeiten: Außerdem gibt es jetzt mehr Fehlermodi, da T-Shirt aufgrund eines Rohrbruchs beendet wird, wenn Ihr sekundärer Prozess fehlschlägt.