GNU/Linux >> Tutoriales Linux >  >> Linux

¿Es posible hacer que las salidas stdout y stderr sean de diferentes colores en XTerm o Konsole?

Aquí hay una solución que combina algunas de las buenas ideas ya presentadas.

Cree una función en un script bash:

color() ( set -o pipefail; "[email protected]" 2>&1>&3 | sed $'s,.*,\e[31m&\e[m,' >&2 ) 3>&1

Úselo así:

$ color command -program -args

Mostrará el stderr del comando en rojo.

Siga leyendo para obtener una explicación de cómo funciona. Hay algunas características interesantes demostradas por este comando.

  • color()... — Crea una función bash llamada color.
  • set -o pipefail — Esta es una opción de shell que conserva el código de retorno de error de un comando cuya salida se canaliza a otro comando. Esto se hace en una subcapa, que se crea entre paréntesis, para no cambiar la opción de falla de tubería en la capa exterior.
  • "[email protected]" — Ejecuta los argumentos de la función como un nuevo comando. "[email protected]" es equivalente a "$1" "$2" ...
  • 2>&1 — Redirige el stderr del comando a stdout para que se convierta en sed de stdin .
  • >&3 — Abreviatura de 1>&3 , esto redirige stdout a un nuevo descriptor de archivo temporal 3 . 3 se enruta de nuevo a stdout más tarde.
  • sed ... — Debido a las redirecciones anteriores, sed de stdin es el stderr del comando ejecutado. Su función es rodear cada línea con códigos de colores.
  • $'...' Una construcción bash que hace que entienda los caracteres con barra invertida
  • .* — Coincide con toda la línea.
  • \e[31m — La secuencia de escape ANSI que hace que los siguientes caracteres sean rojos
  • & — El sed reemplazar el carácter que se expande a toda la cadena coincidente (la línea completa en este caso).
  • \e[m — La secuencia de escape ANSI que restablece el color.
  • >&2 — Abreviatura de 1>&2 , esto redirige sed de stdout a stderr .
  • 3>&1 — Redirige el descriptor de archivo temporal 3 volver a stdout .

Aquí hay una extensión del mismo concepto que también hace que STDOUT sea verde:

function stdred() (
    set -o pipefail;
    (
        "[email protected]" 2>&1>&3 |
        sed $'s,.*,\e[31m&\e[m,' >&2
    ) 3>&1 |
    sed $'s,.*,\e[32m&\e[m,'
)

También puede consultar stderred:https://github.com/sickill/stderred


No puedo ver que haya alguna forma de que el emulador de terminal haga esto.

La interfaz entre el emulador de terminal y el shell/aplicación es a través de un pseudo-tty, donde el emulador de terminal está en el lado maestro y el shell/aplicación en el otro. El shell/aplicación tiene stdout y stderr conectados al mismo pty, por lo que cuando el emulador de terminal lee del pty para el resultado de shell/app, ya no puede saber cuál se escribió en stdout y cuál en stderr.

Tendrá que usar una de las soluciones que intercepta los datos entre la aplicación y el esclavo-pty e inserta códigos de escape para controlar el color de salida del terminal.


Linux
  1. Redirigir toda la salida al archivo en Bash

  2. Eco para stdout y stderr

  3. ¿Es seguro deshabilitar el almacenamiento en búfer con stdout y stderr?

  4. Canalización de stdout y stderr dentro de una regla Makefile

  5. Determinar si la salida es stdout o stderr

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

¿Mostrar solo Stderr en pantalla pero escribir tanto Stdout como Stderr en el archivo?

¿Confundido acerca de stdin, stdout y stderr?

Restaurar stdout y stderr al valor predeterminado

¿Es posible que el descriptor de archivo de Linux 0 1 2 no sea para stdin, stdout y stderr?

Color diferente para comando y salida