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 elstderr
del comando astdout
para que se convierta ensed
destdin
.>&3
— Abreviatura de1>&3
, esto redirigestdout
a un nuevo descriptor de archivo temporal3
.3
se enruta de nuevo astdout
más tarde.sed ...
— Debido a las redirecciones anteriores,sed
destdin
es elstderr
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&
— Elsed
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 de1>&2
, esto redirigesed
destdout
astderr
.3>&1
— Redirige el descriptor de archivo temporal3
volver astdout
.
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.