Ho esplorato quasi tutte le domande simili disponibili , senza risultati.
Vorrei descrivere il problema in dettaglio:
Eseguo alcuni script incustoditi e questi possono produrre output standard e righe di errore standard, voglio catturarli nel loro ordine preciso come visualizzato da un emulatore di terminale e quindi aggiungere un prefisso come "STDERR:" e "STDOUT:" a loro.
Ho provato a usare pipe e persino un approccio basato su epoll su di esse, senza risultati. Penso che la soluzione sia nell'uso pty, anche se non sono un maestro in questo. Ho anche dato una sbirciatina al codice sorgente del VTE di Gnome , ma non è stato molto produttivo.
Idealmente avrei usato Go invece di Bash per ottenere questo risultato, ma non sono stato in grado di farlo. Sembra che i tubi proibiscano automaticamente di mantenere un corretto ordine delle linee a causa del buffering.
Qualcuno è stato in grado di fare qualcosa di simile? O è semplicemente impossibile? Penso che se un emulatore di terminale può farlo, allora non lo è - forse creando un piccolo programma C che gestisce i PTY in modo diverso?
Idealmente, vorrei utilizzare l'input asincrono per leggere questi 2 flussi (STDOUT e STDERR) e quindi ristamparli secondo le mie esigenze, ma l'ordine di input è cruciale!
NOTA: sono a conoscenza di stderred ma non funziona per me con gli script Bash e non posso essere facilmente modificato per aggiungere un prefisso (poiché fondamentalmente avvolge un sacco di syscall).
Aggiornamento: aggiunto sotto due elementi
(i ritardi casuali al secondo possono essere aggiunti nello script di esempio che ho fornito per dimostrare un risultato coerente)
Aggiornamento: la soluzione a questa domanda risolverebbe anche questa altra domanda , come ha sottolineato @Gilles. Tuttavia sono giunto alla conclusione che non è possibile fare ciò che è stato chiesto qua e là. Quando si utilizzano 2>&1
entrambi i flussi, questi vengono correttamente uniti a livello di pty / pipe, ma per utilizzare i flussi separatamente e nell'ordine corretto, si dovrebbe effettivamente utilizzare l'approccio di stderred che invoca l'aggancio di syscall e può essere visto come sporco in molti modi.
Non vedo l'ora di aggiornare questa domanda se qualcuno può smentire quanto sopra.