En cuanto a una solución para redirigir muchos comandos a la vez:
#!/bin/bash
{
somecommand
somecommand2
somecommand3
} 2>&1 | tee -a $DEBUGLOG
Por qué su solución original no funciona: exec 2> & 1 redirigirá la salida de error estándar a la salida estándar de su shell, que, si ejecuta su script desde la consola, será su consola. la redirección de la tubería en los comandos solo redirigirá la salida estándar del comando.
Desde el punto de vista de somecommand
, su salida estándar entra en una tubería conectada tee
y el error estándar entra en el mismo archivo / pseudofile que el error estándar del shell, que redirige a la salida estándar del shell, que será el consola si ejecuta su programa desde la consola.
La única forma verdadera de explicarlo es ver lo que realmente sucede:
El entorno original de su shell podría verse así si lo ejecuta desde la terminal:
stdin -> /dev/pts/42
stdout -> /dev/pts/42
stderr -> /dev/pts/42
Después de redirigir el error estándar a la salida estándar ( exec 2>&1
), usted ... básicamente no cambia nada. Pero si redirige la salida estándar del script a un archivo, terminaría con un entorno como este:
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /dev/pts/42
Luego, redirigir el error estándar del shell a la salida estándar terminaría así:
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /your/file
Ejecutar un comando heredará este entorno. Si ejecuta un comando y lo canaliza al tee, el entorno del comando sería:
stdin -> /dev/pts/42
stdout -> pipe:[4242]
stderr -> /your/file
Por lo tanto, el error estándar de su comando todavía entra en lo que el shell usa como error estándar.
En realidad, puede ver el entorno de un comando mirando /proc/[pid]/fd
: use ls -l
también para enumerar el contenido del enlace simbólico. El 0
archivo aquí es entrada estándar, 1
salida estándar y 2
error estándar. Si el comando abre más archivos (y la mayoría de los programas lo hacen), también los verá. Un programa también puede elegir redirigir o cerrar su entrada / salida estándar y reutilizar 0
, 1
y 2
.
|&
funciona como un atajo para2>&1 |
, es al menos un poco más conveniente.