redirecciones en bash
El problema:
Cuando escribimos scripts de shell, resulta bastante común querer redireccionar la salida de la ejecución a un log file. También suele suceder que queremos redireccionar la salida desde dentro del mismo script q estamos ejecutando, pero nos damos cuenta de ello una vez que ya lo tenemos escrito 😛
La solución más común (también la mas perezosa) es escribir un segundo script «wrapper» cuya única función es «wrapear» (wrapear dije, no rapear!) la llamada al script principal, agregando la redirección deseada.
Es un patrón (quizás debiera llamarle «antipatrón» :)) bastante común:
Código de wrapper.sh
#! /bin/bash
. scriptWrapeado.sh > log.txt
Código de scriptWrapeado.sh
#! /bin/bash
date
uname -a
ls
… … …
En fin, si te has encontrado con ese problema, y no tienes muchas ganas de pensar en la solución, aquí tienes una:
#! /bin/bash
SALIDA=»log.txt»
# file descriptor 4 imprimira la salida en STDOUT y tambien en SALIDA (como si usaramos ‘tee’)
exec 4> >(while read linea; do echo $linea; echo $linea >>$SALIDA; done)
# en el file descriptor 5 conservaremos la referencia a STDOUT
exec 5>&1
# STDOUT es redireccionado
exec >&4
# generamos alguna salida
date
uname -a
ls
… … …
# finalizado el código cuya salida deseamos capturar, volvemos STDOUT a la normalidad
exec >&5
echo «ahora prueba ejecutar cat log.txt »
Dudas? Comentarios? Críticas? Escríbelo por favor
que opinas tu?