O comando Unix / Linux de Kyle faz o trabalho de alternar o STDERR com o STDOUT; no entanto, a explicação não está certa. Os operadores de redirecionamento não fazem nenhuma cópia ou 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 exibirá um erro porque o & 3 ainda não existe, pois está localizado antes do 3> & 1. 3> Algo é uma maneira de declarar (definir) que vamos usar um terceiro tubo, então ele precisa ser localizado antes de colocarmos água nesse tubo, por exemplo, como Kyle o escreveu. Tente este outro caminho 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 pena. Você não pode fazer coisas como "3> & 1 3> & 2" no mesmo comando, porque o Linux usará apenas o primeiro encontrado e dispensa o segundo.
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. Por exemplo, tenho um trabalho cron em que desejo que as duas saídas (erro e padrão) sejam enviadas para um arquivo de log e deixem que o erro também apareça para fazer uma mensagem de email enviada ao 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 que eu resolvi o problema:
((echo "STD1"; sdfr "bbbb"; echo "STD2" ) 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1
Observe que eu tenho que usar log1 duas vezes e preciso acrescentar nos dois casos, o primeiro usando a opção "-a" para o comando "tee" e o segundo usando ">>".
Ao fazer um log1 de gato, você obtém o seguinte:
STD1
STD2
-bash: sdfr: command not found
Observe que o erro não aparece na segunda linha como deveria.