O comando Unix / Linux do Kyle faz o trabalho de trocar o STDERR pelo STDOUT; no entanto, a explicação não está correta. Os operadores de redirecionamento não fazem cópia nem duplicação, apenas redirecionam o fluxo para uma direção diferente.
Reescrever o comando de Kyle movendo temporariamente o 3 > & 1 para o final facilitaria a compreensão do conceito:
find /var/log 1>&2 2>&3 3>&1
Escrito desta maneira, porém, o Linux exibiria um erro porque & 3 ainda não existe, pois está localizado antes de 3 > & 1. 3 > alguma coisa é uma maneira de declarar (definir) que vamos usar um terceiro tubo, então ele deve estar localizado antes de fluirmos água para aquele tubo, por exemplo, como Kyle o escreveu. Tente esta outra maneira apenas por diversão:
((echo "STD1"; anyerror "bbbb"; echo "STD2" ) 3>&1 4>&2 1>&4 2>&3) > newSTDOUT 2> newSTDERR
Não ter uma maneira de fazer cópias é uma vergonha. Você não pode fazer coisas como "3 > & 1 3 > & 2" no mesmo comando, porque o Linux usará somente o primeiro encontrado e descartará o segundo.
Eu ainda não encontrei uma maneira de enviar o erro e a saída regular para um arquivo e também enviar uma cópia do erro para a saída padrão com um comando. Para instace, eu tenho uma tarefa cron que eu quero que ambas as saídas (erro e padrão) vão para um arquivo de log e deixe o erro também sair para fazer uma mensagem de e-mail enviada para o meu blackBerry. Eu posso fazer isso com dois comandos usando "tee", mas o erro não aparece na ordem correta entre a linha de saída regular no arquivo. Esta é a maneira feia de resolver o problema:
((echo "STD1"; sdfr "bbbb"; echo "STD2" ) 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1
Note que eu tenho que usar log1 duas vezes e eu tenho que acrescentar em ambos os casos, o primeiro usando a opção "-a" para o comando "tee" e o segundo usando "> >".
Fazendo um cat log1 você recebe o seguinte:
STD1
STD2
-bash: sdfr: command not found
Observe que o erro não é exibido na segunda linha como deveria.