Suponha que eu tenha o seguinte canal:
a | b | c | d
Como posso esperar pela conclusão de c(ou b) em shou bash? Isso significa que o script dpode iniciar a qualquer momento (e não precisa ser esperado), mas requer saída completa cpara funcionar corretamente.
O caso de uso é um difftoolpara gitcomparar imagens. É chamado gite precisa processar sua entrada (a a | b | cparte) e exibir os resultados da comparação (a dparte). O chamador excluirá a entrada necessária para ae b. Isso significa que, antes de retornar do script, o processo c(ou b) deve terminar. Por outro lado, não posso esperar dporque isso significa que estou aguardando a entrada do usuário.
Eu sei que posso gravar os resultados de cem um arquivo temporário ou talvez usar um FIFO no bash. (Não tenho certeza se o FIFO ajudará.) É possível conseguir isso sem a necessidade de arquivos temporários sh?
EDITAR
Talvez fosse suficiente se eu pudesse descobrir o ID do processo c(ou b) de uma maneira confiável. Em seguida, todo o canal poderia ser iniciado de forma assíncrona e eu poderia esperar por um ID do processo. Algo ao longo das linhas de
wait $(a | b | { c & [print PID of c] ; } | d)
EDIT ^ 2
Encontrei uma solução, comentários (ou ainda melhores soluções) são bem-vindos.
dé livre para começar quando quiser, mas cprecisa terminar antes que eu possa seguir em frente.
dpode começar quando quiser, o que exatamente você está esperando?
dnão usar a saída de, centão parece não fazer sentido fazer dparte do pipeline. Mas se dusar a entrada, ddeve trabalhar um pouco na entrada depois de ler tudo para que sua abordagem faça alguma diferença.
diniciarca saída do processamento somente após acconclusão? Você não desejadiniciar o processamento de cada linha de saída como ela vem?