Comment imprimer l'erreur standard en rouge

14

Comment imprimer l'erreur standard en rouge dans la console au lieu d'utiliser la même couleur que la sortie standard?

Est-il possible d'utiliser Gnome Terminal ?

Aslan986
la source
Ce lien pourrait vous aider
devav2
Vous pouvez activer ce comportement pour une commande à l'hilite aide de l' utilitaire . Vous devez ajouter manuellement hiliteà votre commande shell pour l'utiliser, mais c'est toujours utile si vous savez ou suspectez qu'une commande génère des erreurs et que vous souhaitez les localiser.
Rory O'Kane

Réponses:

8

J'utilise stderred et l'ai trouvé une bonne solution. Comme son readme le note:

Stderred accroche sur write () et une famille de fonctions de flux (fwrite, fprintf, error ...) de libc afin de coloriser toutes les sorties stderr qui vont au terminal, ce qui le distingue de stdout. Fondamentalement, il enveloppe le texte qui va dans le fichier avec le descripteur "2" avec les codes d'échappement ANSI appropriés, ce qui rend le texte rouge.

Il est implémenté en tant que bibliothèque partagée et ne nécessite pas de recompilation des binaires existants grâce à la fonction de préchargement / insertion des éditeurs de liens dynamiques.

Il est pris en charge sur Linux (avec LD_PRELOAD), FreeBSD (également LD_PRELOAD) et OSX (avec DYLD_INSERT_LIBRARIES).

Il est simple à compiler, mais vous devez le construire à partir des sources en suivant les instructions de son site Github :

sudo apt-get install build-essential git cmake 

alors

git clone git://github.com/sickill/stderred.git
cd stderred

alors

make

La partie la plus importante consiste à ajouter la ligne appropriée à votre .bashrc; vous devez libstderred.socréer un lien vers le fichier dans le répertoire de construction; vous devez utiliser le chemin absolu où se trouve le répertoire de construction (/ home / mike / src / stderred / build). J'ajoute ce qui suit à mon .bashrc:

export LD_PRELOAD="/home/mike/src/stderred/build/libstderred.so${LD_PRELOAD:+:$LD_PRELOAD}"

Évidemment, lorsque vous ne souhaitez plus l'utiliser, supprimez la ligne ci-dessus de votre .bashrcet redémarrez le terminal.

Les résultats, testés sur des fichiers inexistants (cela ne fonctionnera évidemment pas lorsqu'il sudoest utilisé, car l'utilisateur ne .bashrcsera pas lu lorsque l'environnement différent sera défini):

(Soit dit en passant, cela ne transforme pas mon invite duke @ nukem en rouge car c'était déjà rouge )

entrez la description de l'image ici


la source
Je ne peux pas croire que j'ai passé tant d'années sans savoir que cela existe! Il est incroyablement utile et aurait dû faire partie du système d'exploitation depuis, oh, une centaine d'années maintenant. :)
Roger Dahl
6

En général, oui, car Gnome Terminal est un terminal ANSI et prend en charge les codes d'échappement ANSI standard.

Voici un exemple. Tapez ceci dans votre terminal:

echo -e "\e[01;31mREDRUM\e[0m"

L' -eoption permet d'interpréter les codes de barre oblique inverse, ce qui \edevient "Esc" (code hexadécimal 0x1B). Alternativement, pour entrer directement dans escape, appuyez sur ctrl-V Esc:

echo  "^[[01;31mREDRUM^[[0m"

Escape et les [deux forment ensemble le code reconnu par le terminal. Après cette séquence, vous devez insérer une ;liste d'attributs séparés par deux points ( ), terminée par m. Voir ici pour tous les codes. Les exemples incluent l'attribut 0(réinitialiser tous les attributs, comme vous pouvez le remarquer ci-dessus, c'est la séquence qui termine mon exemple) et un tas de style (souligné, brillant, gras, etc.) ainsi que quelques attributs de couleur.

La réponse ci-dessus vous indique comment utiliser la couleur lorsque vous écrivez votre propre programme.

Cependant, si je comprends bien votre question, vous aimeriez avoir une séparation visuelle pour stderr et stdout de tous les programmes que vous exécutez. Ce n'est pas simple sans analyser leur sortie via un filtre. Voici un exemple (trouvé ici ) comment le faire:

  1. Définissez une fonction (vous pouvez la mettre dans votre fichier .bashrc):

    color() { "$@" 2>&1>&3|sed 's,.*,\x1B[31m&\x1B[0m,'>&2; } 3>&1
    
  2. Démarrez des programmes comme celui-ci:

    color program
    

Le stderr des programmes deviendra rouge.

janvier
la source
est-il possible de coloriser tout message erroné de n'importe quel programme?
Luke