Estoy tratando de ordenar los siguientes fragmentos, los objetivos de diseño son registrar toda la salida de un script y no debería ser un contenedor. Menos líneas son mejores.
No me importan las entradas del usuario (en esta etapa), los scripts de destino se ejecutan de forma no interactiva.
El fragmento necesita
- salida stdout para iniciar sesión, y siempre hacer eco a la consola
- salida stderr para iniciar sesión y echo a la consola si la depuración está habilitada
- Los mensajes stderr deben ir precedidos de marcas de tiempo y otra utilidad
Por el momento tengo lo siguiente que solo se prueba en versiones recientes de bash (4.2+?) Como en Ubuntu preciso, pero se porta mal en CentOS6.
DEBUG_LOG="${0##*/}.log"
# copy stdout to log always and echo to console
exec > >(tee -a ${DEBUG_LOG})
# copy stderr to log only, unless debugging is enabled
[ $DEBUG_TEST = "true" ] \
&& exec 2> >(tee -a ${DEBUG_LOG} >&2) \
|| exec 2>> ${DEBUG_LOG}
Luego esto...
# Expand escaped characters, wrap at 70 chars on spaces,
# and indent wrapped lines
msg_log() {
echo -e "$(date +%T) ${0##*/}: $1" \
| fold -w70 -s | sed '2~1s/^/ /' >&2;
}
msg_con() {
if [ "${DEBUG_TEST}" = "true" ]; then
msg_log "$1"
else
echo -e "$1" | fold -w70 -s | sed '2~1s/^/ /';
fi
}
En lugar de echo
que puede llamar a uno de esos procedimientos msg, por ejemplo, msg_con "hello world"
.
También la producción script luego ir a stderr estableciendo como una variable de entorno en tiempo de llamada, por ejemplo, DEBUG_TEST=true myscript
.
He leído que exec puede no funcionar en algunos shells como busybox. Hay una combinación de mkfifo y fork en https://stackoverflow.com/a/5200754 que hace algo similar, pero prefiero no usar fork a menos que sea absolutamente necesario.
Prefiera los ejemplos de bash, por favor, pero algo que funcione bajo sh o sea más portátil sería bueno. ¿Algunas ideas?