En shells, exec
hace 1) aperturas y redirecciones de archivos 2) exec
ing real (reemplazando la imagen de proceso actual con otra imagen de proceso).
Estas exec
son redirecciones.
Primero redirige ( exec 1> >(tee $LOGFILE)
) el stdout
descriptor (1) a una tubería generada por sustitución de proceso conectada a un tee
proceso de ejecución simultánea que tiene $LOGFILE
como primer argumento y luego redirige el stderr
descriptor (2) al mismo lugar donde 1
apunta ahora el descriptor (el tee tubo).
Teniendo en cuenta que los descriptores de archivos se heredan, acaba de hacer que todo el futuro stdout
y la stderr
salida se dirijan al tee
proceso, que lo escribe en $LOGFILE
y 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 tee
con el mismo descriptor de archivo 1 que heredó del shell principal. (Si fuera al revés, tee
se haría que escribiera en su propia entrada, lo que podría hacer un punto muerto, dependiendo de su patrón IO).