Suponha que eu tenha o seguinte canal:
a | b | c | d
Como posso esperar pela conclusão de c
(ou b
) em sh
ou bash
? Isso significa que o script d
pode iniciar a qualquer momento (e não precisa ser esperado), mas requer saída completa c
para funcionar corretamente.
O caso de uso é um difftool
para git
comparar imagens. É chamado git
e precisa processar sua entrada (a a | b | c
parte) e exibir os resultados da comparação (a d
parte). O chamador excluirá a entrada necessária para a
e b
. Isso significa que, antes de retornar do script, o processo c
(ou b
) deve terminar. Por outro lado, não posso esperar d
porque isso significa que estou aguardando a entrada do usuário.
Eu sei que posso gravar os resultados de c
em 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 c
precisa terminar antes que eu possa seguir em frente.
d
pode começar quando quiser, o que exatamente você está esperando?
d
não usar a saída de, c
então parece não fazer sentido fazer d
parte do pipeline. Mas se d
usar a entrada, d
deve trabalhar um pouco na entrada depois de ler tudo para que sua abordagem faça alguma diferença.
d
iniciarc
a saída do processamento somente após ac
conclusão? Você não desejad
iniciar o processamento de cada linha de saída como ela vem?