exec y tee al archivo de registro: explique estos comandos bash

15

Vi esto en la parte superior de mi archivo de script bash:

export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log
exec > >(tee $LOGFILE)
exec 2>&1

¿Qué hace? ¿Qué están haciendo dos procesos ejecutivos aquí? Me doy cuenta de que manteniéndolo así, se canaliza todo el resultado de la ejecución del script, $LOGFILEpero quería entenderlo desde la perspectiva de las execdeclaraciones.

Senthil Kumaran
fuente
Esto podría dejarlo claro: linuxjournal.com/content/bash-redirections-using-exec
coffeMug
1
¿Viste esto en la parte superior de tu archivo de script bash? ;)
Sebb
1
Las dos execlíneas podrían perfectamente ser solo una ( exec > >(tee "$LOGFILE") 2>&1).
Jonathan Leffler

Respuestas:

18

En shells, exechace 1) aperturas y redirecciones de archivos 2) execing real (reemplazando la imagen de proceso actual con otra imagen de proceso).

Estas execson redirecciones.

Primero redirige ( exec 1> >(tee $LOGFILE)) el stdoutdescriptor (1) a una tubería generada por sustitución de proceso conectada a un teeproceso de ejecución simultánea que tiene $LOGFILEcomo primer argumento y luego redirige el stderrdescriptor (2) al mismo lugar donde 1apunta ahora el descriptor (el tee tubo).

Teniendo en cuenta que los descriptores de archivos se heredan, acaba de hacer que todo el futuro stdouty la stderrsalida se dirijan al teeproceso, que lo escribe en $LOGFILEy hacia donde el descriptor de archivos 1 señaló originalmente (probablemente su terminal).


Nota: El proceso tee sale al stdout original (= el descriptor de archivo original 1) porque, como puede aprender de / buscando en bash (1) para Expansión de comando simple y sustitución de proceso, la sustitución de proceso ( >() <()) ocurre (junto con otras expansiones) antes las redirecciones se ejecutan, lo que significa que la redirección exec 1> >(tee "$LOGFILE")ocurre después de que tee ha comenzado, dejando teecon el mismo descriptor de archivo 1 que heredó del shell principal. (Si fuera al revés, teese haría que escribiera en su propia entrada, lo que podría hacer un punto muerto, dependiendo de su patrón IO).

PSkocik
fuente