Voici une solution qui combine certaines des bonnes idées déjà présentées.
Créez une fonction dans un script bash :
color() ( set -o pipefail; "[email protected]" 2>&1>&3 | sed $'s,.*,\e[31m&\e[m,' >&2 ) 3>&1
Utilisez-le comme ceci :
$ color command -program -args
 Il affichera le stderr de la commande en rouge.
Continuez à lire pour une explication de son fonctionnement. Il y a quelques fonctionnalités intéressantes démontrées par cette commande.
- color()...— Crée une fonction bash appelée color.
- set -o pipefail— Il s'agit d'une option shell qui conserve le code de retour d'erreur d'une commande dont la sortie est redirigée vers une autre commande. Cela se fait dans un sous-shell, qui est créé par les parenthèses, afin de ne pas modifier l'option pipefail dans le shell externe.
- "[email protected]"— Exécute les arguments de la fonction en tant que nouvelle commande.- "[email protected]"est équivalent à- "$1" "$2" ...
- 2>&1— Redirige le- stderrde la commande à- stdoutpour qu'il devienne- sedest- stdin.
- >&3— Raccourci pour- 1>&3, cela redirige- stdoutvers un nouveau descripteur de fichier temporaire- 3.- 3est renvoyé dans- stdoutplus tard.
- sed ...— En raison des redirections ci-dessus,- sedest- stdinest le- stderrde la commande exécutée. Sa fonction est d'entourer chaque ligne de codes couleurs.
- $'...'Une construction bash qui lui fait comprendre les caractères échappés par une barre oblique inverse
- .*— Correspond à toute la ligne.
- \e[31m— La séquence d'échappement ANSI qui fait que les caractères suivants sont rouges
- &— Le- sedremplace le caractère qui s'étend à l'intégralité de la chaîne correspondante (la ligne entière dans ce cas).
- \e[m— La séquence d'échappement ANSI qui réinitialise la couleur.
- >&2— Raccourci pour- 1>&2, cela redirige- sedest- stdoutau- stderr.
- 3>&1— Redirige le descripteur de fichier temporaire- 3retour en- stdout.
Voici une extension du même concept qui rend également STDOUT vert :
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,'
)
Vous pouvez également consulter stderred :https://github.com/sickill/stderred
Je ne vois aucun moyen pour l'émulateur de terminal de faire cela.
L'interface entre l'émulateur de terminal et le shell/l'application se fait via un pseudo-tty, où l'émulateur de terminal est du côté maître et le shell/l'application de l'autre. Le shell/l'application ont à la fois stdout et stderr connectés au même pty, donc lorsque l'émulateur de terminal lit à partir du pty pour la sortie du shell/de l'application, il ne peut plus dire lequel a été écrit sur stdout et lequel sur stderr.
Vous devrez utiliser l'une des solutions qui intercepte les données entre l'application et le slave-pty et insère des codes d'échappement pour contrôler la sortie du terminal colo(u)r.