Supponiamo che io abbia la seguente pipe:
a | b | c | d
Come posso attendere il completamento di c(o b) in sho bash? Ciò significa che lo script dpuò iniziare in qualsiasi momento (e non è necessario attendere) ma richiede un output completo cper funzionare correttamente.
Il caso d'uso è un difftoola gitche confronta le immagini. Viene chiamato da gite deve elaborare il suo input (la a | b | cparte) e visualizzare i risultati del confronto (la dparte). Il chiamante eliminerà l'input necessario per ae b. Ciò significa che prima di tornare dallo script, il processo c(o b) deve terminare. D'altra parte, non posso aspettare dperché questo significa che sto aspettando l'input dell'utente.
So di poter scrivere i risultati cin un file temporaneo, o forse usare un FIFO in bash. (Non sono sicuro che FIFO sarà di aiuto, però.) È possibile farlo senza file temporanei sh?
MODIFICARE
Forse sarebbe sufficiente se potessi scoprire l'ID del processo c(o b) in modo affidabile. Quindi è possibile avviare l'intera pipe in modo asincrono e attendere un ID processo. Qualcosa del genere
wait $(a | b | { c & [print PID of c] ; } | d)
EDIT 2 ^
Ho trovato una soluzione, i commenti (o soluzioni ancora migliori) sono i benvenuti.
dè libero di iniziare quando vuole, ma cdeve finire prima di poter andare avanti.
dpuò iniziare quando gli piace, cosa stai aspettando esattamente?
dnon utilizza l'output di c, sembra non avere alcun senso fare dparte della pipeline. Ma se dusa l'input, allora ddeve lavorare un po 'sul suo input dopo averlo letto tutto affinché il tuo approccio faccia la differenza.
diniziare l'elaborazionecdell'output solo dopo checè stato completato? Non vuoidiniziare a elaborare ogni linea di output come viene?