Припустимо, у мене є така труба:
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
починати обробляти кожен вихідний рядок, як він є?