J'imagine que bash ne colorera jamais sa sortie: certains programmes voudront peut-être analyser quelque chose, et la colorisation gâchera les données avec des séquences échappées. Une application graphique devrait gérer les couleurs, je suppose.
Kolypto
La combinaison des réponses Balázs Pozsár et killdash9 donne la précision suivante: function color { "$@" 2> >(sed $'s,.*,\e[31m&\e[m,') } fonctionne pour bash et zsh. Impossible d'ajouter ceci comme une réponse b / c.
Heinrich Hartmann
1
J'attends une réponse qui modifie bash pour le faire. Les solutions ci - dessous tout en fait modifier stderr et peut - être même modifier son ordre stdout wrt qui brise les choses lorsque la séquence d'octets exacte de stderr doit être préservée , par exemple lorsque la tuyauterie.
Génial! Mais je me demande s’il est possible de le rendre permanent :)
kolypto
9
Bon conseil! Suggestion: en ajoutant >&2juste avant ; done), la sortie destinée à stderr est en réalité écrite sur stderr. Cela est utile si vous souhaitez capturer la sortie normale du programme.
Henko
8
Les utilisations suivantes tput, et est un peu plus lisible à mon avis:command 2> >(while read line; do echo -e "$(tput setaf 1)$line$(tput sgr0)" >&2; done)
Stefan Lasiewski
2
Je pense que l'exécution de 2 processus de tput pour chaque ligne de sortie n'est pas élégante du tout. Peut-être que vous voudriez stocker la sortie des commandes tput dans une variable et utiliser celles-ci pour chaque écho. Mais là encore, la lisibilité n'est pas vraiment meilleure.
Balázs Pozsár
1
Cette solution ne préserve pas les espaces mais je l’aime pour sa brièveté. IFS= read -r linedevrait aider mais ne le fait pas. Pas certain de pourquoi.
Max Murphy
89
Méthode 1: Utiliser la substitution de processus:
command 2>>(sed $'s,.*,\e[31m&\e[m,'>&2)
Méthode 2: Créer une fonction dans un script bash:
Les deux méthodes vont montrer la commande stderren rouge.
Continuez votre lecture pour une explication du fonctionnement de la méthode 2. Certaines fonctions intéressantes sont illustrées par cette commande.
color()... - Crée une fonction bash appelée couleur.
set -o pipefail- Il s'agit d'une option de shell qui conserve le code de retour d'erreur d'une commande dont la sortie est canalisée vers une autre commande. Cela est fait dans un sous-shell, qui est créé par les parenthèses, afin de ne pas changer l'option pipefail dans le shell externe.
"$@"- Exécute les arguments de la fonction en tant que nouvelle commande. "$@"est équivalent à"$1" "$2" ...
2>&1- la Redirections stderrde la commande stdoutafin qu'elle devienne sedl » stdin.
>&3- Abrégé pour 1>&3, cela redirige stdoutvers un nouveau descripteur de fichier temporaire 3. 3est réacheminé stdoutplus tard.
sed ...- En raison des réoriente ci - dessus, sed« s stdinest stderrde la commande exécutée. Sa fonction est d’entourer chaque ligne de codes de couleur.
$'...' Une construction bash qui lui fait comprendre les caractères échappés par une barre oblique inverse
.* - Correspond à la ligne entière.
\e[31m - La séquence d'échappement ANSI qui fait que les caractères suivants sont rouges
&- Le sedcaractère de remplacement qui s'étend à toute 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- pour sténographie 1>&2, ce réoriente sedest stdoutà stderr.
3>&1- Redirige le descripteur de fichier temporaire 3dans stdout.
Pourquoi avez-vous besoin de faire toute la redirection supplémentaire? ça ressemble à de l'overkill
qodeninja
1
Y a-t-il un moyen de le faire fonctionner zsh?
Eyal Levin
1
ZSH ne reconnaît pas les formulaires de redirection abrégés. Il a juste besoin de deux autres 1, c'est-à-dire:zsh: color()(set -o pipefail;"$@" 2>&1 1>&3|sed $'s,.*,\e[31m&\e[m,'1>&2)3>&1
Wow, cet utilitaire est génial, la seule chose dont il aurait besoin est d’avoir un référentiel apt qui l’installe pour tous les utilisateurs, avec une ligne, sans avoir à faire plus de travail pour l’activer.
sorin
Cela semblait bien fonctionner lorsque je l'ai testé avec un script de construction dans un terminal séparé, mais j'hésite à l'utiliser de manière globale (en .bashrc). Merci quand même!
Joel Purra
2
Dans OS X El Capitan, la façon dont cela fonctionne (DYLD_INSERT_LIBRARIES) est "interrompue" dans les fichiers binaires du système, car ils sont protégés par SIP. Il serait donc préférable d’utiliser les options bash données dans d’autres réponses.
hmijail
1
@hmijail pour MacOS, veuillez suivre github.com/sickill/stderred/issues/60 afin que nous puissions trouver une solution de contournement, une solution partielle existe déjà, mais elle est un peu buggée.
sorin
15
La façon la plus simple de rendre stderr rouge en permanence consiste à utiliser "exec" pour rediriger les flux. Ajoutez ce qui suit à votre base:
C'est de loin la meilleure réponse. facile à mettre en œuvre sans installation / nécessitant le privilège sudo, et pouvant être généralisé à toutes les commandes.
Luke Davis
1
Malheureusement, cela ne fonctionne pas bien avec l'enchaînement des commandes (commande && nextCommand || errorHandlerCommand). La sortie d'erreur va après la sortie de errorHandlerCommand.
carlin.scott
1
De même, si je source ~/.bashrcdouble cette opération, mon terminal se verrouille.
Dolph
@Dolf: Dans mon panier, je garde facilement cela avec une instruction if entourant d'empêcher ce code de recharger. Sinon, le problème est la redirection 'exec 9> & 2' après que la redirection a déjà eu lieu. Peut-être changer la constante si vous savez où> 2 pointe à l'origine.
J'ai créé un script d'emballage qui implémente la réponse de Balázs Pozsár en pure bash. Enregistrez-le dans vos commandes $ PATH et préfixe pour coloriser leur sortie.
#! / bin / bash
if [$ 1 == "--help"]; ensuite
echo "Exécute une commande et colorise toutes les erreurs survenues"
echo "Exemple:` basename $ {0} `wget ..."
echo "(c) o_O Tync, ICQ # 1227-700, profitez-en!"
sortie 0
Fi
# Fichier temporaire pour attraper toutes les erreurs
TMP_ERRS = $ (mktemp)
# Commande exécuter
"$ @" 2>> (pendant la lecture de la ligne; echo -e "\ e [01; 31m $ line \ e [0m" | tee --append $ TMP_ERRS; done)
EXIT_CODE = $?
# Affiche à nouveau toutes les erreurs
if [-s "$ TMP_ERRS"]; ensuite
echo -e "\ n \ n \ n \ e [01; 31m === ERREURS === \ e [0m"
cat $ TMP_ERRS
Fi
rm -f $ TMP_ERRS
# Terminer
quitter $ EXIT_CODE
Ne pas résoudre le problème. Vous n'avez pas fourni de moyen de séparer stderr de stdout, c'est ce qui intéresse le PO.
Jeremy Visser
1
J'ai une version légèrement modifiée du script de O_o Tync. J'avais besoin de créer ces mods pour OS X Lion et ce n'est pas parfait car le script se termine parfois avant la commande encapsulée. J'ai ajouté un sommeil mais je suis sûr qu'il y a un meilleur moyen.
#!/bin/bashif[ $1 =="--help"];then
echo "Executes a command and colorizes all errors occured"
echo "Example: `basename ${0}` wget ..."
echo "(c) o_O Tync, ICQ# 1227-700, Enjoy!"
exit 0fi# Temp file to catch all errors
TMP_ERRS=`mktemp /tmp/temperr.XXXXXX`|| exit 1# Execute command"$@"2>>(while read line;do echo -e "$(tput setaf 1)$line\n"| tee -a $TMP_ERRS;done)
EXIT_CODE=$?
sleep 1# Display all errors againif[-s "$TMP_ERRS"];then
echo -e "\n\n\n$(tput setaf 1) === ERRORS === "
cat $TMP_ERRS
else
echo "No errors collected in $TMP_ERRS"fi
rm -f $TMP_ERRS
# Finish
exit $EXIT_CODE
J'ai mis cette fonction dans mon .bashrcou .zshrc:
# Red STDERR# rse <command string>function rse(){# We need to wrap each phrase of the command in quotes to preserve arguments that contain whitespace# Execute the command, swap STDOUT and STDERR, colour STDOUT, swap back((eval $(for phrase in"$@";do echo -n "'$phrase' ";done))3>&11>&22>&3| sed -e "s/^\(.*\)$/$(echo -en \\033)[31;1m\1$(echo -en \\033)[0m/")3>&11>&22>&3}
function color { "$@" 2> >(sed $'s,.*,\e[31m&\e[m,') }
fonctionne pour bash et zsh. Impossible d'ajouter ceci comme une réponse b / c.Réponses:
la source
>&2
juste avant; done)
, la sortie destinée à stderr est en réalité écrite sur stderr. Cela est utile si vous souhaitez capturer la sortie normale du programme.tput
, et est un peu plus lisible à mon avis:command 2> >(while read line; do echo -e "$(tput setaf 1)$line$(tput sgr0)" >&2; done)
IFS= read -r line
devrait aider mais ne le fait pas. Pas certain de pourquoi.Méthode 1: Utiliser la substitution de processus:
Méthode 2: Créer une fonction dans un script bash:
Utilisez-le comme ceci:
Les deux méthodes vont montrer la commande
stderr
en rouge.Continuez votre lecture pour une explication du fonctionnement de la méthode 2. Certaines fonctions intéressantes sont illustrées par cette commande.
color()...
- Crée une fonction bash appelée couleur.set -o pipefail
- Il s'agit d'une option de shell qui conserve le code de retour d'erreur d'une commande dont la sortie est canalisée vers une autre commande. Cela est fait dans un sous-shell, qui est créé par les parenthèses, afin de ne pas changer l'option pipefail dans le shell externe."$@"
- Exécute les arguments de la fonction en tant que nouvelle commande."$@"
est équivalent à"$1" "$2" ...
2>&1
- la Redirectionsstderr
de la commandestdout
afin qu'elle deviennesed
l »stdin
.>&3
- Abrégé pour1>&3
, cela redirigestdout
vers un nouveau descripteur de fichier temporaire3
.3
est réacheminéstdout
plus tard.sed ...
- En raison des réoriente ci - dessus,sed
« sstdin
eststderr
de la commande exécutée. Sa fonction est d’entourer chaque ligne de codes de couleur.$'...'
Une construction bash qui lui fait comprendre les caractères échappés par une barre oblique inverse.*
- Correspond à la ligne entière.\e[31m
- La séquence d'échappement ANSI qui fait que les caractères suivants sont rouges&
- Lesed
caractère de remplacement qui s'étend à toute 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
- pour sténographie1>&2
, ce réorientesed
eststdout
àstderr
.3>&1
- Redirige le descripteur de fichier temporaire3
dansstdout
.la source
zsh
?zsh: color()(set -o pipefail;"$@" 2>&1 1>&3|sed $'s,.*,\e[31m&\e[m,'1>&2)3>&1
Vous pouvez également consulter stderred: https://github.com/sickill/stderred
la source
.bashrc
). Merci quand même!La façon la plus simple de rendre stderr rouge en permanence consiste à utiliser "exec" pour rediriger les flux. Ajoutez ce qui suit à votre base:
J'ai déjà posté sur ceci précédemment: Comment définir la couleur de police pour STDOUT et STDERR
la source
source ~/.bashrc
double cette opération, mon terminal se verrouille.http://sourceforge.net/projects/hilite/
la source
J'ai créé un script d'emballage qui implémente la réponse de Balázs Pozsár en pure bash. Enregistrez-le dans vos commandes $ PATH et préfixe pour coloriser leur sortie.
la source
Vous pouvez utiliser une fonction comme celle-ci
J'ajoute> & 2 pour imprimer sur stderr
la source
J'ai une version légèrement modifiée du script de O_o Tync. J'avais besoin de créer ces mods pour OS X Lion et ce n'est pas parfait car le script se termine parfois avant la commande encapsulée. J'ai ajouté un sommeil mais je suis sûr qu'il y a un meilleur moyen.
la source
Cette solution a fonctionné pour moi: https://superuser.com/questions/28869/immediately-tell-which-output-was-sent-to-stderr
J'ai mis cette fonction dans mon
.bashrc
ou.zshrc
:Alors par exemple:
va me donner une sortie rouge.
la source
set -o pipefail;
avant(eval
pour le code de sortie de redirection"
à eval pour préserver les espaces dans les argumentsen utilisant xargs et printf:
la source
une version utilisant fifos
la source