Je veux configurer mon terminal pour stderr
est imprimé dans une couleur différente de stdout
; peut-être rouge. Cela faciliterait la distinction entre les deux.
Existe-t-il un moyen de configurer cela dans .bashrc
? Si non, est-ce même possible ?
Remarque :Cette question a été fusionnée avec une autre qui demandait stderr
, stdout
et l'écho de l'entrée utilisateur à imprimer en 3 couleurs différentes . Les réponses peuvent répondre à l'une ou l'autre des questions.
Réponse acceptée :
Il s'agit d'une version plus difficile de Afficher uniquement stderr à l'écran mais d'écrire à la fois stdout et stderr dans le fichier.
Les applications s'exécutant dans le terminal utilisent un seul canal pour communiquer avec lui; les applications ont deux ports de sortie, stdout et stderr, mais ils sont tous deux connectés au même canal.
Vous pouvez connecter l'un d'eux à un canal différent, ajouter de la couleur à ce canal et fusionner les deux canaux, mais cela entraînera deux problèmes :
- La sortie fusionnée peut ne pas être exactement dans le même ordre que s'il n'y avait pas eu de redirection. En effet, le traitement supplémentaire sur l'un des canaux prend (un peu) de temps, de sorte que le canal coloré peut être retardé. Si une mise en mémoire tampon est effectuée, le trouble sera pire.
- Les terminaux utilisent des séquences d'échappement à changement de couleur pour déterminer la couleur d'affichage, par ex.
␛[31m
signifie "passer au premier plan rouge". Cela signifie que si une sortie destinée à stdout arrive juste au moment où une sortie pour stderr est affichée, la sortie sera mal colorée. (Pire encore, s'il y a un changement de chaîne au milieu d'une séquence d'échappement, vous verrez des ordures.)
En principe, il serait possible d'écrire un programme qui écoute sur deux ptys¹, de manière synchrone (c'est-à-dire qu'il n'accepte pas l'entrée sur un canal pendant qu'il traite la sortie sur l'autre canal), et sort immédiatement vers le terminal avec les instructions de changement de couleur appropriées. Vous perdriez la possibilité d'exécuter des programmes qui interagissent avec le terminal. Je ne connais aucune implémentation de cette méthode.
Une autre approche possible serait de faire en sorte que le programme produise les séquences de changement de couleur appropriées, en s'accrochant à toutes les fonctions libc qui appellent le write
appel système dans une bibliothèque chargée avec LD_PRELOAD
. Voir la réponse de Sickill pour une implémentation existante, ou la réponse de Stéphane Chazelas pour une approche mixte qui exploite strace
.
En pratique, si cela est applicable, je suggère de rediriger stderr vers stdout et de passer dans un coloriseur basé sur un motif tel que colortail ou multitail, ou des coloriseurs spéciaux tels que colorgcc ou colormake.
En relation :Comment supprimer /volumes/ du service d'automatisation à l'aide d'un script shell existant ?¹ pseudo-terminaux. Les tubes ne fonctionneraient pas à cause de la mise en mémoire tampon :la source pourrait écrire dans la mémoire tampon, ce qui romprait la synchronicité avec le coloriseur.