GNU/Linux >> Tutoriels Linux >  >> Linux

Configurer le shell pour imprimer Stderr et Stdout dans différentes couleurs ?

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.


Linux
  1. Comment rediriger la sortie vers un fichier et Stdout sous Linux

  2. Comment affecter la sortie d'une commande à une variable Shell ?

  3. Sortie vers Stdout et en même temps Grep dans un fichier ?

  4. Comment rediriger Stderr et Stdout vers différents fichiers et également les afficher dans le terminal ?

  5. Comment installer et configurer le HAProxy sur CentOS ?

Comment savoir si la sortie d'une commande ou d'un script shell est Stdout ou Stderr ?

Afficher uniquement Stderr à l'écran, mais écrire à la fois Stdout et Stderr dans un fichier ?

Est-il possible de faire en sorte que les sorties stdout et stderr soient de couleurs différentes dans XTerm ou Konsole ?

Rediriger toutes les sorties vers un fichier dans Bash

Echo à la fois stdout et stderr

Pourquoi la sortie de certains programmes Linux ne va-t-elle ni à STDOUT ni à STDERR ?