El comando Unix / Linux de Kyle hace el trabajo de cambiar el STDERR con el STDOUT; Sin embargo, la explicación no es del todo correcta. Los operadores de redireccionamiento no copian ni duplican, simplemente redirigen el flujo a una dirección diferente.
Reescribir el comando de Kyle moviendo temporalmente el 3> & 1 hasta el final, facilitaría la comprensión del concepto:
find /var/log 1>&2 2>&3 3>&1
Sin embargo, escrito de esta manera, Linux mostraría un error porque & 3 aún no existe, ya que se encuentra antes de 3> & 1. 3> algo es una forma de declarar (definir) que vamos a usar una tercera tubería, por lo que debe ubicarse antes de que fluya agua en esa tubería, por ejemplo, la forma en que Kyle lo escribió. Pruebe esto de otra manera solo por diversión:
((echo "STD1"; anyerror "bbbb"; echo "STD2" ) 3>&1 4>&2 1>&4 2>&3) > newSTDOUT 2> newSTDERR
No tener una forma de hacer copias es una pena. No puede hacer cosas como "3> & 1 3> & 2" en el mismo comando, porque Linux solo usará el primero encontrado y descartará el segundo.
No he encontrado (todavía) una forma de enviar tanto el error como la salida regular a un archivo y también enviar una copia del error a la salida estándar con un comando. Por ejemplo, tengo un trabajo cron que quiero que ambas salidas (error y estándar) vayan a un archivo de registro y dejen que el error también salga para hacer un mensaje de correo electrónico enviado a mi BlackBerry. Puedo hacerlo con dos comandos usando "tee" pero el error no se muestra en el orden correcto entre la línea de salida regular en el archivo. Esta es la forma fea en que resolví el problema:
((echo "STD1"; sdfr "bbbb"; echo "STD2" ) 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1
Tenga en cuenta que tengo que usar log1 dos veces y tengo que agregar en ambos casos, el primero usando la opción "-a" para el comando "tee" y el segundo usando ">>".
Al hacer un gato log1 obtienes lo siguiente:
STD1
STD2
-bash: sdfr: command not found
Observe que el error no se muestra en la segunda línea como debería.