Angenommen, ich habe die folgende Pipe:
a | b | c | d
Wie kann ich auf den Abschluss von c
(oder b
) in sh
oder warten bash
? Dies bedeutet, dass das Skript d
jederzeit gestartet werden kann (und nicht gewartet werden muss), jedoch eine vollständige Ausgabe von benötigt c
, um ordnungsgemäß zu funktionieren.
Der Anwendungsfall ist ein difftool
für git
den Vergleich von Bildern. Es wird von aufgerufen git
und muss seine Eingabe (das a | b | c
Teil) verarbeiten und die Ergebnisse des Vergleichs (das d
Teil) anzeigen . Der Anrufer löscht die für a
und erforderlichen Eingaben b
. Dies bedeutet, dass der Prozess c
(oder b
) beendet werden muss , bevor Sie vom Skript zurückkehren . Andererseits kann ich nicht warten, d
da dies bedeutet, dass ich auf Benutzereingaben warte.
Ich weiß, dass ich die Ergebnisse c
in eine temporäre Datei schreiben oder vielleicht ein FIFO verwenden kann bash
. (Sie sind sich jedoch nicht sicher, ob das FIFO helfen wird.) Ist dies ohne temporäre Dateien möglich sh
?
BEARBEITEN
Vielleicht würde es ausreichen, wenn ich die Prozess-ID des c
(oder b
) Prozesses zuverlässig herausfinden könnte . Dann könnte die gesamte Pipe asynchron gestartet werden und ich könnte auf eine Prozess-ID warten. Etwas in der Art von
wait $(a | b | { c & [print PID of c] ; } | d)
EDIT ^ 2
Ich habe eine Lösung gefunden, Kommentare (oder noch bessere Lösungen) sind willkommen.
d
beginnen, c
muss aber beendet werden, bevor ich weitermachen kann.
d
anfangen können, wann es Ihnen gefällt, worauf warten Sie dann genau?
d
die Ausgabe von nicht verwendet wird c
, scheint es keinen Sinn zu machen, d
Teil der Pipeline zu sein. Wenn d
die Eingabe jedoch verwendet wird, d
muss eine Weile an der Eingabe gearbeitet werden, nachdem Sie alles gelesen haben, damit Ihr Ansatz einen Unterschied macht.
d
diec
Ausgabe erst nachc
Abschluss der Verarbeitung starten ? Sie möchten nichtd
jede Ausgabezeile sofort verarbeiten?