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, $LOGFILE
pero quería entenderlo desde la perspectiva de las exec
declaraciones.
exec
líneas podrían perfectamente ser solo una (exec > >(tee "$LOGFILE") 2>&1
).Respuestas:
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)
) elstdout
descriptor (1) a una tubería generada por sustitución de proceso conectada a untee
proceso de ejecución simultánea que tiene$LOGFILE
como primer argumento y luego redirige elstderr
descriptor (2) al mismo lugar donde1
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 lastderr
salida se dirijan altee
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ónexec 1> >(tee "$LOGFILE")
ocurre después de quetee
ha comenzado, dejandotee
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).fuente