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 elstderrdel comando astdoutpara que se convierta enseddestdin.>&3— Abreviatura de1>&3, esto redirigestdouta un nuevo descriptor de archivo temporal3.3se enruta de nuevo astdoutmás tarde.sed ...— Debido a las redirecciones anteriores,seddestdines elstderrdel 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&— Elsedreemplazar 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 redirigeseddestdoutastderr.3>&1— Redirige el descriptor de archivo temporal3volver 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.