Предположим, у меня есть следующая труба:
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?
РЕДАКТИРОВАТЬ
Возможно, было бы достаточно, если бы я мог достоверно узнать идентификатор процесса c(или b) процесса. Тогда весь канал мог бы быть запущен асинхронно, и я мог ждать идентификатор процесса. Нечто подобное
wait $(a | b | { c & [print PID of c] ; } | d)
EDIT ^ 2
Я нашел решение, комментарии (или еще лучшие решения) приветствуются.
dможно начинать, когда захочется , но cнужно закончить, прежде чем я смогу двигаться дальше.
dможете начать, когда захотите, чего именно вы ждете?
dне использовать выходные данные, cто, кажется, не имеет никакого смысла делать dчасть конвейера. Но если dон использует входные данные, то dдолжен некоторое время поработать над их вводом после прочтения всего этого, чтобы ваш подход имел какое-либо значение.
dначать обработкуcвывода только послеcзавершения? Вы не хотитеdначинать обрабатывать каждую строку вывода, как она есть?