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 lestderr
de la commande àstdout
pour qu'il deviennesed
eststdin
.>&3
— Raccourci pour1>&3
, cela redirigestdout
vers un nouveau descripteur de fichier temporaire3
.3
est renvoyé dansstdout
plus tard.sed ...
— En raison des redirections ci-dessus,sed
eststdin
est lestderr
de 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&
— Lesed
remplace 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 pour1>&2
, cela redirigesed
eststdout
austderr
.3>&1
— Redirige le descripteur de fichier temporaire3
retour enstdout
.
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.