Evite que el reloj rompa los colores

Evite que el reloj rompa los colores

Estoy alterando scripts en el trabajo que monitorean archivos de registro para seleccionar ciertos elementos y colorearlos. El resultado final es una lista de números de 6 dígitos en varias columnas. Pude agregar un ~al comienzo del número y no interrumpe nada en el resultado final, pero es bastante feo y difícil de leer. Sin embargo, cuando intento colorear el número, ya sea en scripts bash anteriores o en el procesamiento final de los datos en un script perl, el texto en color se altera.

Por ejemplo, el número original, que pondré en $num:

123456

Ingresé esto en perl (o lo mismo en bash):

"\e[1;34m" . $num . "\e[0m"

Y esto es lo que obtengo:

[1;34m123456[0m 

También probé esta, una versión escapada, pero obtengo lo mismo:

"\x1B[1;34m" . $num . "\x1B[0m"

Si esto marca la diferencia, aquí está la verdadera pila de scripts (es un desastre):

  • Perl llama dentro del script de shell, que luego canaliza a grep/ cut/etc.
  • script de shell con más cut/etc., luego canaliza a .pl
  • El script de shell vigila esa salida.

¿Quizás watchentonces no le gusta el color?

No lo sé perlmuy bien, así que supongo que no estaría de más mostrar lo que veo alrededor de las líneas impresas:

my $format = ("%-8s") x scalar(@{$a[0]});

printf("$format\n", @$_)

Respuesta1

Encontré los problemas de "robo de color" conmirar, es porque watch usa un estilo de salida simple /bin/sh, que elimina cualquier color, alias, atajos... ¡todo el asunto!

Así que improvisé esto y lo coloqué en mi.bashrc, me permite usar todos mis propios alias, atajos y todo eso:

Usage:
    watcher 20 'somecommand | apipe | grep'

El número es el retraso entre actualizaciones; en segundos, el comando puede incluir cualquier cosa que puedas citar.

###### 'watch' workalike, lets me use my aliases and such
function watcher() { WATCHERTIME=$1 ; WATCHERFILE=/tmp/watcher$$ ; shift ; while true ; do WATCHERHEIGHT=$(($LINES - 5)) ; ( eval $* ) | tail -n ${WATCHERHEIGHT} > ${WATCHERFILE} 2>/dev/null; clear ; /bin/echo -n "Every ${WATCHERTIME} seconds - " ; date ; /bin/echo ; cat ${WATCHERFILE} ; \rm -f ${WATCHERFILE} ; /bin/echo ; /bin/echo "==" ; sleep ${WATCHERTIME} ; done ; }

Para desglosarlo:

function watcher()
{ 
  WATCHERTIME=$1
  WATCHERFILE=/tmp/watcher$$
  shift
  while true; do
    WATCHERHEIGHT=$(($LINES - 5))
    ( eval $* ) | tail -n ${WATCHERHEIGHT} > ${WATCHERFILE} 2>/dev/null
    clear
    /bin/echo -n "Every ${WATCHERTIME} seconds - "
    date
    /bin/echo
    cat ${WATCHERFILE}
    \rm -f ${WATCHERFILE}
    /bin/echo
    /bin/echo "=="
    sleep ${WATCHERTIME}
  done
}

Determina la altura actual de la pantalla en líneas, resta lo suficiente para su propia salida, luego ejecuta repetidamente el comando dado, luego limpia la pantalla, muestra la salida y espera el siguiente bucle. Muestra un '==' corto en la parte inferior para indicar que ahí es donde terminó la salida. A veces es útil saber esto.

Lo hice de esta manera para que hubiera el menor retraso posible en la visualización. si no captura la salida y luego la muestra, obtiene una pausa larga, luego la salida... repugnante.

Como no afecta los colores, obtienes todo lo que estás acostumbrado a obtener. ¡Disfrutar!

Respuesta2

El problema es que watchlos usos de Curses y las cursesfunciones de salida de cadenas funcionan en un framebuffer virtual con planos separados para los caracteres y sus atributos/colores. Las cadenas se envían al framebuffer tal cual, sin interpretación de directiva de terminal. Para protegerse contra la destrucción del estado terminal, Curses ignora ESC(entre otras cosas), por lo que watchno utilizará el color de forma predeterminada.

Puedes solucionarlo siguiendo los sabios consejos de cualquiera de los dos.jw013olornix: use watch --coloro ajuste su script en algo así como un while true; do clear; $SCRIPT; sleep 2; donebucle.

Respuesta3

Probablemente necesites la --coloropción watch.

información relacionada