Предположим, у меня есть следующая труба:
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
начинать обрабатывать каждую строку вывода, как она есть?