GNU/Linux >> Tutoriales Linux >  >> Linux

¿Configurar el Shell para imprimir Stderr y Stdout en diferentes colores?

Quiero configurar mi terminal para stderr está impreso en un color diferente al stdout; tal vez rojo Esto facilitaría distinguirlos.

¿Hay alguna forma de configurar esto en .bashrc? ? Si no, ¿es esto posible?

Nota :esta pregunta se fusionó con otra que solicitaba stderr , stdout y el eco de entrada del usuario para salir en 3 colores diferentes . Las respuestas pueden abordar cualquiera de las dos preguntas.

Respuesta aceptada:

Esta es una versión más difícil de Mostrar solo stderr en pantalla, pero escribe tanto stdout como stderr en el archivo.

Las aplicaciones que se ejecutan en el terminal utilizan un único canal para comunicarse con él; las aplicaciones tienen dos puertos de salida, stdout y stderr, pero ambos están conectados al mismo canal.

Puede conectar uno de ellos a un canal diferente, agregar color a ese canal y fusionar los dos canales, pero esto causará dos problemas:

  • Es posible que la salida combinada no esté exactamente en el mismo orden que si no hubiera habido redirección. Esto se debe a que el procesamiento agregado en uno de los canales lleva (un poco) tiempo, por lo que el canal coloreado puede retrasarse. Si se realiza alguna amortiguación, el trastorno será peor.
  • Los terminales utilizan secuencias de escape que cambian de color para determinar el color de la pantalla, p. ␛[31m significa "cambiar a primer plano rojo". Esto significa que si alguna salida destinada a stdout llega justo cuando se muestra alguna salida para stderr, la salida tendrá un color incorrecto. (Aún peor, si hay un cambio de canal en medio de una secuencia de escape, verá basura).

En principio, sería posible escribir un programa que escuche en dos ptys¹, sincrónicamente (es decir, no aceptará entrada en un canal mientras procesa la salida en el otro canal) e inmediatamente envíe la salida al terminal con las instrucciones de cambio de color apropiadas. Perdería la capacidad de ejecutar programas que interactúan con la terminal. No conozco ninguna implementación de este método.

Otro enfoque posible sería hacer que el programa genere las secuencias de cambio de color adecuadas, conectando todas las funciones libc que llaman a write llamada al sistema en una biblioteca cargada con LD_PRELOAD . Consulte la respuesta de Sickill para una implementación existente o la respuesta de Stéphane Chazelas para un enfoque mixto que aprovecha strace .

En la práctica, si eso es aplicable, sugiero redirigir stderr a stdout y canalizar a un colorizador basado en patrones como colortail o multitail, o colorizadores de propósito especial como colorgcc o colormake.

Relacionado:¿Cómo eliminar /volumes/ del servicio de automatización utilizando un script de shell existente?

¹ pseudo-terminales. Las tuberías no funcionarían debido al almacenamiento en búfer:la fuente podría escribir en el búfer, lo que rompería la sincronía con el colorizador.


Linux
  1. ¿Cómo asignar la salida de un comando a una variable de shell?

  2. ¿Cómo redirigir Stderr y Stdout a diferentes archivos y también mostrarlos en la terminal?

  3. ¿Cómo instalar y configurar HAProxy en CentOS?

  4. Cómo redirigir la salida a un archivo y stdout

  5. ¿Cómo redirigir stderr y stdout a diferentes archivos en la misma línea en el script?

Redirigir toda la salida al archivo en Bash

Eco para stdout y stderr

En bash, ¿hay alguna forma de repetir/imprimir la última salida estándar? ¿Hay alguna variable a la que esté asignada la salida estándar?

Shell:redirigir stdout a /dev/null y stderr a stdout

¿Por qué la salida de algunos programas de Linux no va ni a STDOUT ni a STDERR?

Color diferente para comando y salida