Est-il possible de faire en sorte que bash affiche les messages stderr en rouge?
function color { "$@" 2> >(sed $'s,.*,\e[31m&\e[m,') }
fonctionne pour bash et zsh. Impossible d'ajouter ceci comme une réponse b / c.
Est-il possible de faire en sorte que bash affiche les messages stderr en rouge?
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:
command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m" >&2; done)
>&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:
command 2> >(sed $'s,.*,\e[31m&\e[m,'>&2)
Méthode 2: Créer une fonction dans un script bash:
color()(set -o pipefail;"$@" 2>&1>&3|sed $'s,.*,\e[31m&\e[m,'>&2)3>&1
Utilisez-le comme ceci:
$ color command
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 Redirections stderr
de la commande stdout
afin qu'elle devienne sed
l » stdin
.>&3
- Abrégé pour 1>&3
, cela redirige stdout
vers un nouveau descripteur de fichier temporaire 3
. 3
est réacheminé stdout
plus tard.sed ...
- En raison des réoriente ci - dessus, sed
« s stdin
est stderr
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&
- Le sed
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énographie 1>&2
, ce réoriente sed
est stdout
à stderr
.3>&1
- Redirige le descripteur de fichier temporaire 3
dans stdout
.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
.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:
exec 9>&2
exec 8> >(
while IFS='' read -r line || [ -n "$line" ]; do
echo -e "\033[31m${line}\033[0m"
done
)
function undirect(){ exec 2>&9; }
function redirect(){ exec 2>&8; }
trap "redirect;" DEBUG
PROMPT_COMMAND='undirect;'
J'ai déjà posté sur ceci précédemment: Comment définir la couleur de police pour STDOUT et STDERR
source ~/.bashrc
double cette opération, mon terminal se verrouille.
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
Vous pouvez utiliser une fonction comme celle-ci
#!/bin/sh
color() {
printf '\033[%sm%s\033[m\n' "$@"
# usage color "31;5" "string"
# 0 default
# 5 blink, 1 strong, 4 underlined
# fg: 31 red, 32 green, 33 yellow, 34 blue, 35 purple, 36 cyan, 37 white
# bg: 40 black, 41 red, 44 blue, 45 purple
}
string="Hello world!"
color '31;1' "$string" >&2
J'ajoute> & 2 pour imprimer sur stderr
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/bash
if [ $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 0
fi
# 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 again
if [ -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
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
:
# 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>&1 1>&2 2>&3 | sed -e "s/^\(.*\)$/$(echo -en \\033)[31;1m\1$(echo -en \\033)[0m/") 3>&1 1>&2 2>&3
}
Alors par exemple:
$ rse cat non_existing_file.txt
va me donner une sortie rouge.
set -o pipefail;
avant (eval
pour le code de sortie de redirection
"
à eval pour préserver les espaces dans les arguments
en utilisant xargs et printf:
command 2> >(xargs -0 printf "\e[31m%s\e[m" >&2)