Capturando STDERR y STDOUT para archivar usando tee

15

No estoy claro cuál es el mejor orden para capturar ambos STDERRy STDOUTpara el mismo archivo usando tee. Sé que si quiero canalizar a un archivo tengo que asignar el identificador de archivo después de la redirección, es decir

find . >/tmp/output.txt 2>&1

Esto indica al shell para enviar STDOUTa /tmp/output.txty luego enviar STDERRa STDOUT(que ahora está enviando a /tmp/output.txt).

Intentar realizar 2>&1antes de redirigir el archivo no tendrá el efecto deseado.

Sin embargo, cuando quiero usar tuberías teedebería ser:

find . |tee /tmp/output.txt 2>&1   # or
find . 2>&1 |tee /tmp/output.txt   # ?
PÁGINAS.
fuente

Respuestas:

18

El último; se asegura de que STDOUT y STDERR del comando original vayan al mismo fd, luego los alimenta conjuntamente en tee. En el primer caso, es el STDERR del comando tee que unirías con su STDOUT.

MadHatter
fuente
55
Curiosamente, la página de manual de bash dice: "Si |&se usa, el error estándar del comando1 se conecta a la entrada estándar del comando2 a través de la tubería; es la abreviatura de 2>&1 |. Esta redirección implícita del error estándar se realiza después de cualquier redirección especificada por el comando".
PP.
Tuve que crear un pequeño programa en C que escribe tanto en el stderry stdoutpara comprender este problema. Los operadores de redirección >y tee |difieren cuando se intenta capturar ambas secuencias de salida. Para la redirección tuve que hacerlo ./testapp > /tmp/out.log 2>&1. Mientras que para tee tuve que hacerlo ./testapp 2>&1 | tee /tmp/out.log.
typelogic
@daixtr por lo que vale, |normalmente se conoce como operador de tubería. teese refiere solo al programa particular que se invoca en el otro extremo de la tubería.
MadHatter