Você pode usar o seguinte truque para trocar stdout e stderr. Então você apenas usa a funcionalidade de canal regular.
( proc1 3>&1 1>&2- 2>&3- ) | proc2
Fornecido stdoute stderrambos apontaram para o mesmo lugar no início, isso vai lhe dar o que você precisa.
O que o x>ybit faz é alterar o identificador de arquivo, xpara que ele agora envie suas informações para onde o identificador de arquivo yaponta atualmente. Para o nosso caso específico:
3>&1cria um novo identificador 3que será exibido no identificador atual1 (stdout original), apenas para salvá-lo em algum lugar para o marcador final abaixo.
1>&2modifica o identificador 1(stdout) para enviar para o identificador atual2 (stderr original).
2>&3-modifica o identificador 2(stderr) para enviar para o identificador atual3 (stdout original) e depois fecha o identificador 3(via -no final).
É efetivamente o comando swap que você vê nos algoritmos de classificação:
temp = value1;
value1 = value2;
value2 = temp;
rc, que é outro shell. Por exemplo:proc1 |[2] proc2. Não é legal? Não nobashentanto.