Cómo imprimir un error estándar en rojo

14

¿Cómo puedo imprimir el error estándar en rojo en la consola en lugar de usar el mismo color de la salida estándar?

¿Es posible usar Gnome Terminal ?

Aslan986
fuente
Este enlace podría ayudarte
devav2
Puede habilitar este comportamiento para un comando utilizando la hiliteutilidad . Tiene que anteponer manualmente hilitesu comando de shell para usarlo, pero sigue siendo útil si sabe o sospecha que un comando genera errores y desea localizarlos.
Rory O'Kane

Respuestas:

8

Yo uso stderred y he encontrado una buena solución. Como señala su léame :

Stderred engancha a write () y una familia de funciones de flujo (fwrite, fprintf, error ...) de libc para colorear toda la salida stderr que va al terminal, lo que lo hace distinguible de stdout. Básicamente, envuelve el texto que va al archivo con el descriptor "2" con los códigos de escape ANSI adecuados que hacen que el texto sea rojo.

Se implementa como una biblioteca compartida y no requiere la recompilación de los archivos binarios existentes gracias a la función de precarga / inserción de los enlazadores dinámicos.

Es compatible con Linux (con LD_PRELOAD), FreeBSD (también LD_PRELOAD) y OSX (con DYLD_INSERT_LIBRARIES).

Es fácil de compilar, pero debe compilarlo desde la fuente siguiendo las instrucciones de su sitio Github :

sudo apt-get install build-essential git cmake 

Luego

git clone git://github.com/sickill/stderred.git
cd stderred

Luego

make

La parte más importante es agregar la línea apropiada a su .bashrc; debe vincular al libstderred.soarchivo en el directorio de compilación; debe usar la ruta absoluta donde está el directorio de compilación (/ home / mike / src / stderred / build). Añado lo siguiente a mi .bashrc:

export LD_PRELOAD="/home/mike/src/stderred/build/libstderred.so${LD_PRELOAD:+:$LD_PRELOAD}"

Obviamente, cuando ya no quiera usarlo, elimine la línea anterior .bashrcy reinicie el terminal.

Los resultados, probados en archivos inexistentes (obviamente no funcionarán cuando sudose usen, ya que el usuario .bashrcno será leído cuando se establezca un entorno diferente):

(Por cierto, no convierte mi indicador duke @ nukem en rojo ya que ya era rojo )

ingrese la descripción de la imagen aquí


fuente
¡No puedo creer que haya pasado tantos años sin saber que esto existe! Es increíblemente útil y debería haber sido parte del sistema operativo durante, aproximadamente, cien años más o menos. :)
Roger Dahl
6

En general, sí, ya que Gnome Terminal es un terminal ANSI y admite los códigos de escape ANSI estándar.

Aquí hay un ejemplo. Escriba esto en su terminal:

echo -e "\e[01;31mREDRUM\e[0m"

La -eopción permite interpretar códigos de barra invertida, de modo que se \econvierte en "Esc" (código hexadecimal 0x1B). Alternativamente, para ingresar a escape directamente, presione ctrl-V Esc:

echo  "^[[01;31mREDRUM^[[0m"

Escape y [ambos forman juntos el código que reconoce el terminal. Después de esa secuencia, debe insertar una ;lista de atributos separada por dos puntos ( ), terminada por m. Vea aquí todos los códigos. Los ejemplos incluyen atributo 0(restablecer todos los atributos, como puede observar arriba, es la secuencia que termina mi ejemplo) y un montón de estilo (subrayado, brillante, negrita, etc.), así como algunos atributos de color.

La respuesta anterior le dice cómo usar el color cuando escribe su propio programa.

Sin embargo, si entiendo su pregunta correctamente, le gustaría tener una separación visual para stderr y stdout de cualquier programa que esté ejecutando. Esto no es sencillo sin analizar su salida a través de un filtro. Aquí hay un ejemplo (que se encuentra aquí ) de cómo hacerlo:

  1. Defina una función (puede ponerla en su archivo .bashrc):

    color() { "$@" 2>&1>&3|sed 's,.*,\x1B[31m&\x1B[0m,'>&2; } 3>&1
    
  2. Inicie programas como este:

    color program
    

El stderr de los programas se coloreará de rojo.

enero
fuente
¿hay alguna forma de hacer que coloree algún mensaje de error de cualquier programa?
Lucas