Supposons que j'ai le tuyau suivant:
a | b | c | d
Comment puis-je attendre la fin de c(ou b) dans shou bash? Cela signifie que le script dpeut démarrer à tout moment (et n'a pas besoin d'être attendu) mais nécessite une sortie complète de cpour fonctionner correctement.
Le cas d'utilisation est un difftoolpour gitqui compare les images. Il est appelé par gitet doit traiter son entrée (la a | b | cpartie) et afficher les résultats de la comparaison (la dpartie). L'appelant supprimera l'entrée requise pour aet 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 dcar cela signifie que j'attends la saisie de l'utilisateur.
Je sais que je peux écrire les résultats de cdans 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.
dest libre de commencer quand bon lui semble, mais cdoit se terminer avant que je puisse continuer.
dpouvez commencer quand vous le souhaitez, qu'attendez-vous exactement?
dn'utilise pas la sortie de calors il ne semble pas logique de faire dpartie du pipeline. Mais si dutilise l'entrée, il dfaut travailler un moment sur son entrée après l'avoir lue pour que votre approche fasse la différence.
dcommencercla sortie du traitement uniquement après lacfin? Vous ne voulezdpas commencer à traiter chaque ligne de sortie au fur et à mesure?