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.

execlíneas podrían perfectamente ser solo una (exec > >(tee "$LOGFILE") 2>&1).Respuestas:
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)) elstdoutdescriptor (1) a una tubería generada por sustitución de proceso conectada a unteeproceso de ejecución simultánea que tiene$LOGFILEcomo primer argumento y luego redirige elstderrdescriptor (2) al mismo lugar donde1apunta ahora el descriptor (el tee tubo).Teniendo en cuenta que los descriptores de archivos se heredan, acaba de hacer que todo el futuro
stdouty lastderrsalida se dirijan alteeproceso, 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ónexec 1> >(tee "$LOGFILE")ocurre después de queteeha comenzado, dejandoteecon 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).fuente