Załóżmy, że mam następującą potok:
a | b | c | d
Jak mogę czekać na zakończenie c
(lub b
) w sh
lub bash
? Oznacza to, że skrypt d
może się uruchomić w dowolnym momencie (i nie trzeba na niego czekać), ale c
do prawidłowego działania wymaga pełnego wyjścia .
Sprawa stosowanie jest difftool
dla git
że porównuje obrazy. Jest wywoływany git
i musi przetworzyć dane wejściowe ( a | b | c
część) i wyświetlić wyniki porównania ( d
część). Dzwoniący usunie dane wymagane dla a
i b
. Oznacza to, że przed powrotem ze skryptu proces c
(lub b
) musi zostać zakończony. Z drugiej strony nie mogę się doczekać, d
ponieważ oznacza to, że czekam na dane wejściowe użytkownika.
Wiem, że mogę zapisać wyniki c
do pliku tymczasowego lub użyć FIFO w bash
. (Nie jestem jednak pewien, czy FIFO pomoże). Czy można to osiągnąć bez tymczasowych plików sh
?
EDYTOWAĆ
Być może byłoby wystarczające, gdybym mógł w wiarygodny sposób znaleźć identyfikator procesu c
(lub b
) procesu. Wtedy cała rura mogłaby zostać uruchomiona asynchronicznie i mogłem poczekać na identyfikator procesu. Coś w stylu
wait $(a | b | { c & [print PID of c] ; } | d)
EDYCJA ^ 2
Znalazłem rozwiązanie, komentarze (lub jeszcze lepsze rozwiązania) są mile widziane.
d
można rozpocząć, kiedy tylko chce, ale c
musi się skończyć, zanim będę mógł przejść dalej.
d
można zacząć, kiedy chce, na co dokładnie czekasz?
d
nie używa danych wyjściowych c
, wydaje się, że nie ma sensu d
wchodzić w skład potoku. Ale jeśli d
korzysta z danych wejściowych, to d
po ich przeczytaniu musi działać chwilę po ich przeczytaniu, aby Twoje podejście miało jakąkolwiek różnicę.
d
rozpocząć przetwarzanie danychc
wyjściowych dopiero poc
zakończeniu? Nie chceszd
rozpoczynać przetwarzania każdej linii wyjściowej, jaka się pojawi?