Eu explorei quase todas as perguntas semelhantes disponíveis , sem sucesso.
Deixe-me descrever o problema em detalhes:
Eu executo alguns scripts autônomos e eles podem produzir saída padrão e linhas de erro padrão. Quero capturá-los em sua ordem precisa, conforme exibido por um emulador de terminal, e depois adicionar um prefixo como "STDERR:" e "STDOUT:" a eles.
Eu tentei usar pipes e até mesmo uma abordagem baseada em epolls, sem sucesso. Eu acho que a solução está em uso pty, embora eu não seja mestre nisso. Também examinei o código-fonte do VTE do Gnome , mas isso não foi muito produtivo.
Idealmente, eu usaria o Go em vez do Bash para fazer isso, mas não consegui. Parece que os tubos proíbem automaticamente manter uma ordem correta das linhas devido ao buffer.
Alguém foi capaz de fazer algo semelhante? Ou é simplesmente impossível? Eu acho que se um emulador de terminal pode fazer isso, então não é - talvez criando um pequeno programa C manipulando os PTY (s) de maneira diferente?
Idealmente, eu usaria entrada assíncrona para ler esses 2 fluxos (STDOUT e STDERR) e depois os reimprimiria segundo minhas necessidades, mas a ordem de entrada é crucial!
NOTA: Conheço stderred, mas ele não funciona para mim com scripts Bash e não pode ser facilmente editado para adicionar um prefixo (já que basicamente envolve muitos syscalls).
Atualização: adicionada abaixo de duas sugestões
(atrasos aleatórios de menos de um segundo podem ser adicionados no script de amostra que forneci para provar um resultado consistente)
Atualização: a solução para essa pergunta também resolveria essa outra questão , como apontou o @Gilles. No entanto, cheguei à conclusão de que não é possível fazer o que é solicitado aqui e ali. Quando o uso de 2>&1
ambos os fluxos é mesclado corretamente no nível pty / pipe, mas para usá- los separadamente e na ordem correta, deve-se realmente usar a abordagem de stderred que invole o gancho do syscall e pode ser vista como suja de várias maneiras.
Ficarei ansioso para atualizar esta pergunta se alguém puder refutar o que foi dito acima.