un blog de opiniones con mate lavado

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?