No pude hacer funcionar la línea muy simple de Dennis, así que aquí hay un método mucho más complicado. Yo probaría el primero.
Como se mencionó, puede usar exec para redirigir el error estándar y la salida estándar para todo el script. Así:
exec > $LOGFILE 2>&1
esto generará todos los stderr y stdout a $ LOGFILE.
Ahora, dado que desea que esto se muestre en la consola, así como en un archivo de registro, también tendrá que usar una tubería con nombre para que el ejecutivo escriba y comience a leer.
(Técnicamente, One-liner de Dennis también hace esto, aunque obviamente de una manera diferente) La tubería en sí está creada con mkfifo $PIPEFILE
. Luego haz lo siguiente.
# Comience a escribir tee en un archivo de registro, pero extraiga su entrada de nuestra tubería con nombre.
tee $ LOGFILE <$ PIPEFILE &
# captura el ID de proceso de tee para el comando de espera.
TEEPID = $!
# redirige el resto de stderr y stdout a nuestra canalización con nombre.
exec> $ PIPEFILE 2> & 1
echo "Haz tus comandos aquí"
echo "Todo su estándar saldrá teed".
echo "Así será su error estándar"> & 2
# cierra los descriptores de archivo stderr y stdout.
exec 1> & - 2> & -
# Espere a que termine el tee desde ahora que el otro extremo de la tubería se ha cerrado.
esperar $ TEEPID
Si desea ser exhaustivo, puede crear y destruir el archivo de canalización con nombre al principio y al final de su secuencia de comandos.
Para el registro, obtuve la mayor parte de esto de una publicación de blog muy informativa de un tipo aleatorio: ( Versión archivada )