Como redirecionar stdout + stderr para um arquivo, mantendo os fluxos separados?

Redirecionar o stdout + stderr de tal forma que ambos sejam gravados em um arquivo enquanto ainda estão saindo para o stdout é bastante simples:

cmd 2>&1 | tee output_file

Mas agora ambos os stdout / stderr do cmd estão chegando no stdout. Eu gostaria de escrever stdout + stderr para o mesmo arquivo (para que a ordem seja preservada supondo que cmd seja de thread único), mas ainda assim possa redirecioná-los separadamente, algo assim:

some_magic_tee_variant combined_output cmd > >(command-expecting-stdout) 2> >(command-expecting-stderr)

Portanto, combined_output contém os dois com ordem preservada, mas o comando-expecting-stdout somente obtém stdout e o comando-expecting-stderr só obtém stderr. Basicamente, eu quero logar stdout + stderr enquanto ainda permitir stdout e stderr serem redirecionados e canalizados separadamente. O problema com a abordagem tee é globs juntos. Existe uma maneira de fazer isso no bash / zsh?

questionAnswers(5)

yourAnswerToTheQuestion