Припустимо, у мене є така труба:
a | b | c | d
Як я можу дочекатися завершення c(або b) в shчи bash? Це означає, що сценарій dможе запускатися будь-коли (і його не потрібно чекати), але cдля коректної роботи потрібен повний результат роботи.
Випадок використання - це difftoolдля gitпорівняння зображень. Він викликається gitі повинен обробити його вхід ( a | b | cчастина) і відобразити результати порівняння ( dчастина). Абонент видалить дані, необхідні для aта b. Це означає, що перед поверненням із сценарію процес c(або b) повинен бути припинений. З іншого боку, я не можу чекати, dоскільки це означає, що я чекаю на введення користувача.
Я знаю, що можу записати результати cдо тимчасового файлу або, можливо, використовувати FIFO в bash. (Не впевнений, чи допоможе FIFO.) Чи можна цього досягти без тимчасових файлів sh?
EDIT
Можливо, цього було б достатньо, якби я міг надійно дізнатись ідентифікатор процесу c(або b) процесу. Тоді всю трубу можна було запустити асинхронно, і я міг зачекати ідентифікатора процесу. Щось по лінії
wait $(a | b | { c & [print PID of c] ; } | d)
РЕДАКЦІЯ ^ 2
Я знайшов рішення, коментарі (або ще кращі рішення) вітаються.
dможна запускати коли завгодно, але cпотрібно закінчити, перш ніж я можу рухатись далі.
dможна починати, коли це подобається, що саме ти чекаєш?
dне використовується вихід, cто, здається, немає сенсу робити dчастину трубопроводу. Але якщо ви dвикористовуєте вхід, тоді вам dслід попрацювати деякий час над його входом, прочитавши все це, щоб ваш підхід змінився.
dпочати обробкуcрезультатів лише післяcзавершення? Ви не хочетеdпочинати обробляти кожен вихідний рядок, як він є?