J'ai exploré presque toutes les questions similaires disponibles , en vain.
Permettez-moi de décrire le problème en détail:
J'exécute quelques scripts sans assistance et ceux-ci peuvent produire une sortie standard et des lignes d'erreur standard, je veux les capturer dans leur ordre précis affiché par un émulateur de terminal , puis leur ajouter un préfixe comme "STDERR:" et "STDOUT:".
J'ai essayé d'utiliser des tuyaux et même une approche basée sur epoll sur eux, en vain. Je pense que la solution est en usage pty, bien que je ne sois pas maître à cela. J'ai également jeté un œil au code source du VTE de Gnome , mais cela n'a pas été très productif.
Idéalement, j'utiliserais Go au lieu de Bash pour y parvenir, mais je n'y suis pas parvenu. Il semble que les canaux interdisent automatiquement de conserver un ordre de lignes correct en raison de la mise en mémoire tampon.
Quelqu'un a-t-il pu faire quelque chose de similaire? Ou c'est tout simplement impossible? Je pense que si un émulateur de terminal peut le faire, ce n'est pas le cas - peut-être en créant un petit programme C qui gère différemment les PTY?
Idéalement, j'utiliserais une entrée asynchrone pour lire ces 2 flux (STDOUT et STDERR) et les réimprimer ensuite en fonction de mes besoins, mais l'ordre d'entrée est crucial!
REMARQUE: je connais stderred, mais cela ne fonctionne pas pour moi avec les scripts Bash et ne peut pas être facilement modifié pour ajouter un préfixe (car il encapsule essentiellement de nombreux appels système).
Mise à jour: ajouté sous deux points essentiels
(des retards aléatoires d'une seconde peuvent être ajoutés dans l'exemple de script que j'ai fourni pour prouver un résultat cohérent)
Mise à jour: une solution à cette question résoudrait également cette autre question , comme l'a souligné @Gilles. Cependant, je suis arrivé à la conclusion qu'il n'est pas possible de faire ce qui a été demandé ici et là. Lorsque vous utilisez les 2>&1
deux flux, ils sont correctement fusionnés au niveau pty / pipe, mais pour utiliser les flux séparément et dans le bon ordre, vous devez en effet utiliser l'approche de stderred qui évoque le raccordement syscall et peut être considérée comme sale de plusieurs manières.
Je serai impatient de mettre à jour cette question si quelqu'un peut réfuter ce qui précède.