Supposons que j'ai le tuyau suivant:
a | b | c | d
Comment puis-je attendre la fin de c
(ou b
) dans sh
ou bash
? Cela signifie que le script d
peut démarrer à tout moment (et n'a pas besoin d'être attendu) mais nécessite une sortie complète de c
pour fonctionner correctement.
Le cas d'utilisation est un difftool
pour git
qui compare les images. Il est appelé par git
et doit traiter son entrée (la a | b | c
partie) et afficher les résultats de la comparaison (la d
partie). L'appelant supprimera l'entrée requise pour a
et b
. Cela signifie qu'avant de revenir du script, le processus c
(ou b
) doit se terminer. D'un autre côté, je ne peux pas attendre d
car cela signifie que j'attends la saisie de l'utilisateur.
Je sais que je peux écrire les résultats de c
dans un fichier temporaire, ou peut-être utiliser un FIFO dans bash
. (Je ne sais pas si le FIFO va aider, cependant.) Est-il possible d'y parvenir sans fichiers temporaires sh
?
ÉDITER
Il serait peut-être suffisant que je puisse trouver l'ID de processus du c
(ou b
) processus de manière fiable. Ensuite, le tube entier pourrait être démarré de manière asynchrone et je pouvais attendre un ID de processus. Quelque chose dans le sens de
wait $(a | b | { c & [print PID of c] ; } | d)
MODIFIER ^ 2
J'ai trouvé une solution, les commentaires (ou encore meilleures solutions) sont les bienvenus.
d
est libre de commencer quand bon lui semble, mais c
doit se terminer avant que je puisse continuer.
d
pouvez commencer quand vous le souhaitez, qu'attendez-vous exactement?
d
n'utilise pas la sortie de c
alors il ne semble pas logique de faire d
partie du pipeline. Mais si d
utilise l'entrée, il d
faut travailler un moment sur son entrée après l'avoir lue pour que votre approche fasse la différence.
d
commencerc
la sortie du traitement uniquement après lac
fin? Vous ne voulezd
pas commencer à traiter chaque ligne de sortie au fur et à mesure?