Supponiamo che io abbia la seguente pipe:
a | b | c | d
Come posso attendere il completamento di c
(o b
) in sh
o bash
? Ciò significa che lo script d
può iniziare in qualsiasi momento (e non è necessario attendere) ma richiede un output completo c
per funzionare correttamente.
Il caso d'uso è un difftool
a git
che confronta le immagini. Viene chiamato da git
e deve elaborare il suo input (la a | b | c
parte) e visualizzare i risultati del confronto (la d
parte). Il chiamante eliminerà l'input necessario per a
e b
. Ciò significa che prima di tornare dallo script, il processo c
(o b
) deve terminare. D'altra parte, non posso aspettare d
perché questo significa che sto aspettando l'input dell'utente.
So di poter scrivere i risultati c
in 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 c
deve finire prima di poter andare avanti.
d
può iniziare quando gli piace, cosa stai aspettando esattamente?
d
non utilizza l'output di c
, sembra non avere alcun senso fare d
parte della pipeline. Ma se d
usa l'input, allora d
deve lavorare un po 'sul suo input dopo averlo letto tutto affinché il tuo approccio faccia la differenza.
d
iniziare l'elaborazionec
dell'output solo dopo chec
è stato completato? Non vuoid
iniziare a elaborare ogni linea di output come viene?