actualmente estoy usando lo siguiente para capturar todo lo que va al terminal y tirarlo en un archivo de registro sin embargofiesta de color de camiseta quitar
exec 4<&1 5<&2 1>&2>&>(tee -a $LOG_FILE)
, no quiero códigos de escape de color/desorden de entrar en el archivo de registro. así que tengo algo como esto que sorta funciona
exec 4<&1 5<&2 1>&2>&>(
while read -u 0; do
#to terminal
echo "$REPLY"
#to log file (color removed)
echo "$REPLY" | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' >> $LOG_FILE
done
unset REPLY #tidy
)
excepto read
esperas para retorno de carro que no es ideal para algunas porciones de la secuencia de comandos (por ejemplo echo -n "..."
o printf
sin \n
).
Seguimiento de la respuesta de Jonathan Leffler:
Dado el script de ejemplo test.sh
:
#!/bin/bash
LOG_FILE="./test.log"
echo -n >$LOG_FILE
exec 4<&1 5<&2 1>&2>&>(tee -a >(sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' > $LOG_FILE))
##### ##### #####
# Main
echo "starting execution"
printf "\n\n"
echo "color test:"
echo -e "\033[0;31mhello \033[0;32mworld\033[0m!"
printf "\n\n"
echo -e "\033[0;36mEnvironment:\033[0m\n foo: cat\n bar: dog\n your wife: hot\n fix: A/C"
echo -n "Before we get started. Is the above information correct? "
read YES
echo -e "\n[READ] $YES" >> $LOG_FILE
YES=$(echo "$YES" | sed 's/^\s*//;s/\s*$//')
test ! "$(echo "$YES" | grep -iE '^y(es)?$')" && echo -e "\nExiting... :(" && exit
printf "\n\n"
#...some hundreds of lines of code later...
echo "Done!"
##### ##### #####
# End
exec 1<&4 4>&- 2<&5 5>&-
echo "Log File: $LOG_FILE"
La salida de la terminal es como se esperaba y no hay códigos de escape de color/desorden en el archivo de registro como desee. Sin embargo, al examinar
test.log
, no veo el[READ] ...
(consulte la línea 21 detest.sh
).El archivo de registro [de mi script bash real] contiene la línea
Log File: ...
al final, incluso después de cerrar los 4 y 5 fds. Pude resolver el problema al poner unsleep 1
antes del segundoexec
- Supongo que hay una condición de carrera o chanchullos de FD a los que culpar. Desafortunadamente para ustedes, no puedo reproducir este problema contest.sh
pero me interesaría cualquier especulación que alguien pueda tener.
Tenga en cuenta que \ e ... códigos son específicos de VT100/VT200/etc. y pueden no ser los realmente emitidos por el programa en un tipo diferente de $ TERM. –