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?
fuente
exec > filename
debería funcionar en sh, y realmente funciona en busybox v1.15.3 (noviembre de 2011). Pero la sustitución del proceso no>(command)
es portátil ya que es una extensión bash. Solo evita usarlo en scripts. ¿Por qué>>
no es suficiente para ti?Otra solución es especificar la redirección fuera de sus scripts. Cuando su script se invoca en segundo plano (por cron, o script del sistema, etc.), debería llamarse así
Cuando invoque el script manualmente y desee ver el resultado, simplemente llámelo sin redireccionamientos.
fuente
Estos dos ejemplos harán lo que sus objetivos establecidos son
o
fuente
Podría usar el
tee
comando o elscript
comando, ambos son realmente útiles.fuente