GNU/Linux >> Tutoriels Linux >  >> Linux

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

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 stderr de la commande à stdout pour qu'il devienne sed est stdin .
  • >&3 — Raccourci pour 1>&3 , cela redirige stdout vers un nouveau descripteur de fichier temporaire 3 . 3 est renvoyé dans stdout plus tard.
  • sed ... — En raison des redirections ci-dessus, sed est stdin est le stderr 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
  • & — Le sed 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 pour 1>&2 , cela redirige sed est stdout au stderr .
  • 3>&1 — Redirige le descripteur de fichier temporaire 3 retour 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.


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

  2. Que signifie connecter Stdout et Stdin ?

  3. Est-il possible de créer et d'utiliser des menus dans Vim (basé sur un terminal) ?

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

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

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

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

Confus à propos de stdin, stdout et stderr ?

Rediriger toutes les sorties vers un fichier dans Bash

Echo à la fois stdout et stderr

Est-il sûr de désactiver la mise en mémoire tampon avec stdout et stderr ?