Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

243
Vistas
Análisis de secuencias de control de color de Linux

Estoy tratando de representar la salida de un comando de shell de Linux en HTML. Por ejemplo, systemctl status mysql se ve así en mi terminal:

ingrese la descripción de la imagen aquí

Según entiendo de Floz'z Misc , esperaba que el flujo de caracteres subyacente contuviera códigos de control. Pero al mirarlo en, por ejemplo, hexyl ( systemctl status mysql | hexyl ) no puedo ver ningún código:

ingrese la descripción de la imagen aquí

Mirando cerca de la parte inferior de las líneas 080 y 090 donde se muestra el texto "Activo: fallido", esperaba encontrar algunas secuencias de control para cambiar el color a rojo. Aunque no necesariamente ascii, usé algunas tablas ascii para ayudarme:

  • mirando el segundo lote de 8 caracteres en la línea 090 donde se muestran las letras ive: fa , encuentro:
  • 69 = yo
  • 76 = v
  • 65 = mi
  • 3a = :
  • 20 = espacio
  • 66 = f
  • 61 = un
  • 69 = yo

No hay bytes para las secuencias de control.

Me preguntaba si hexyl elige no mostrarlos, así que escribí un programa Java que genera los bytes sin procesar después de ejecutar el proceso como un script bash y los resultados son los mismos, sin secuencias de control.

El Java es aproximadamente:

 p = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", "systemctl status mysql"}); // runs in the shell p.waitFor(); byte[] bytes = p.getInputStream().readAllBytes(); for(byte b : bytes) { System.out.println(b + "\t" + ((char)b)); }

Eso da como resultado:

 ... 32 32 32 32 32 65 A 99 c 116 t 105 i 118 v 101 e 58 : 32 102 f 97 a 105 i 108 l 101 e 100 d ...

Entonces la pregunta es: ¿Cómo sabe bash que tiene que mostrar la palabra "fallido" en rojo?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

systemctl detecta que la salida no es un terminal y elimina los códigos de colores de la salida.

Relacionado: ¿Detectar si stdin es un terminal o una tubería? , https://unix.stackexchange.com/questions/249723/how-to-trick-a-command-into-thinking-its-output-is-going-to-a-terminal , https://superuser.com /questions/1042175/cómo-hago-conseguir-systemctl-para-imprimir-en-color-cuando-interactúo-con-desde-un-no-t

Las herramientas a veces (a veces no) vienen con opciones para habilitar los códigos de color siempre, como ls --color=always , grep --color=always on en el caso de systemd con la variable de entorno SYSTEMD_COLORS .


¿Qué herramienta puedo usar para verlos?

Puedes usar hexyl para verlos.

¿Cómo sabe bash que tiene que marcar la palabra "fallida" en rojo?

Bash es el caparazón, no tiene ninguna relación.

Su terminal , la ventana gráfica con la que está viendo la salida, sabe marcarla en rojo debido a las secuencias de escape ANSI en la salida. No hay interacción con Bash.


 $ SYSTEMD_COLORS=1 systemctl status dbus.service | grep runn | hexdump -C 00000000 20 20 20 20 20 41 63 74 69 76 65 3a 20 1b 5b 30 | Active: .[0| 00000010 3b 31 3b 33 32 6d 61 63 74 69 76 65 20 28 72 75 |;1;32mactive (ru| 00000020 6e 6e 69 6e 67 29 1b 5b 30 6d 20 73 69 6e 63 65 |nning).[0m since| 00000030 20 53 61 74 20 32 30 32 32 2d 30 31 2d 30 38 20 | Sat 2022-01-08 | 00000040 31 39 3a 35 37 3a 32 35 20 43 45 54 3b 20 35 20 |19:57:25 CET; 5 | 00000050 64 61 79 73 20 61 67 6f 0a |days ago.| 00000059
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda