Angenommen, ich habe die folgende Pipe:
a | b | c | d
Wie kann ich auf den Abschluss von c(oder b) in shoder warten bash? Dies bedeutet, dass das Skript djederzeit 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 difftoolfür gitden Vergleich von Bildern. Es wird von aufgerufen gitund muss seine Eingabe (das a | b | cTeil) verarbeiten und die Ergebnisse des Vergleichs (das dTeil) anzeigen . Der Anrufer löscht die für aund 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, dda dies bedeutet, dass ich auf Benutzereingaben warte.
Ich weiß, dass ich die Ergebnisse cin 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.
dbeginnen, cmuss aber beendet werden, bevor ich weitermachen kann.
danfangen können, wann es Ihnen gefällt, worauf warten Sie dann genau?
ddie Ausgabe von nicht verwendet wird c, scheint es keinen Sinn zu machen, dTeil der Pipeline zu sein. Wenn ddie Eingabe jedoch verwendet wird, dmuss eine Weile an der Eingabe gearbeitet werden, nachdem Sie alles gelesen haben, damit Ihr Ansatz einen Unterschied macht.
ddiecAusgabe erst nachcAbschluss der Verarbeitung starten ? Sie möchten nichtdjede Ausgabezeile sofort verarbeiten?