Lors de l'automatisation d'une tâche, il est judicieux de la tester d'abord manuellement. Il serait utile, cependant, si des données allant vers stderr soient immédiatement reconnaissables en tant que telles, et se distinguent des données allant vers stdout, et d'avoir toutes les sorties ensemble afin qu'il soit évident quelle est la séquence des événements.
Une dernière touche qui serait bien si, à la sortie du programme, il imprimait son code retour.
Toutes ces choses aideraient à automatiser. Oui, je peux faire écho au code retour à la fin d'un programme, et oui, je peux rediriger stdout et stderr; ce que j'aimerais vraiment un shell, un script ou un redirecteur facile à utiliser qui montre stdout en noir, montre stderr entrelacé avec lui en rouge et imprime le code de sortie à la fin.
Y a-t-il une telle bête? [Si cela importe, j'utilise Bash 3.2 sur Mac OS X].
Mise à jour : Désolé, cela fait des mois que je n'ai pas regardé ça. Je suis venu avec un script de test simple:
#!/usr/bin/env python
import sys
print "this is stdout"
print >> sys.stderr, "this is stderr"
print "this is stdout again"
Dans mes tests (et probablement en raison de la façon dont les choses sont tamponnées), rse et hilite affichent tout depuis stdout puis tout depuis stderr. La méthode fifo obtient l'ordre correct mais semble tout coloriser en suivant la ligne stderr. ind s'est plaint de mes lignes stdin et stderr, puis a mis la sortie de stderr en dernier.
La plupart de ces solutions sont réalisables, car il n'est pas atypique que seule la dernière sortie soit envoyée à stderr, mais ce serait quand même bien d'avoir quelque chose qui fonctionne un peu mieux.
Réponses:
Vous pouvez également consulter stderred: https://github.com/sickill/stderred
la source
Je viens de concevoir une méthode folle impliquant des FIFO.
Si vous souhaitez que la sortie stderr soit séparée, vous pouvez ouvrir deux shells distincts et exécuter "
grep --color . foo
" dans l'un sans le&
, puis exécuter la commande dans l'autre (toujours avec le2>foo
). Vous obtiendrez le stderr dans l'grep
un et le stdout dans le principal.Cela fonctionne parce que la sortie stderr est acheminée via le FIFO vers
grep --color
, dont la couleur par défaut est le rouge (du moins c'est pour moi). Lorsque vous avez terminé, justerm
le FIFO (rm foo
).Attention : je ne sais vraiment pas comment cela va gérer l'ordre de sortie, vous devrez le tester.
la source
Oui, c'est possible. Regardez la section "Rendre STDERR rouge" sur ce site pour un exemple de travail.
Le code de base est le suivant
Une brève explication est donnée dans la fonction elle-même. Ce qui est fait, c'est déplacer STDOUT et STDERR, donc sed obtient STDERR en 1, le colore, puis le remplace. Considérez le flux de fichiers 3 comme une variable temporaire ici.
L'appel est assez simple
Cependant, certaines invocations ne fonctionneront pas comme prévu; les mises en garde sont toutes fournies sur la page liée.
Btw, je pense qu'il est également possible de venir avec une solution de la forme
où rse colorisera la sortie.
J'ai aussi trouvé ce projet hilite qui semble faire ça. Je ne l'ai pas essayé, mais c'est peut-être ce que vous cherchez.
Autres projets connexes:
la source
Un autre programme est ind:
http: // www.habets.pp.se/synscan/programs.php?prog=ind (vous devez assembler l'hyperlien vous-même, je n'ai pas assez de points pour plus d'un par réponse). Il y a une capture d'écran et même une capture d'écran.
Il exécute le sous-processus dans un pty, ce que les autres ne font probablement pas. Cela peut être important là où l'ordre est important (c'est souvent le cas), car stderr est immédiatement vidé dans les terminaux et stdout est entièrement tamponné lorsqu'il n'est pas un tty.
Pour une explication complète, voir ceci: http://blog.habets.pp.se/2008/06/Buffering-in-pipes
En outre, ind fonctionne avec des programmes interactifs et des caractères de contrôle. Bash fonctionne comme d'habitude lorsqu'il est lancé avec "ind bash -i".
Cela pourrait fonctionner pour vous donner des couleurs tout en préservant Ctrl-P et.al.
la source
Voici beaucoup de réponses pour mettre encore en évidence la sortie stderr. Je ne peux ajouter qu'un seul assez facile - dans une ligne, que vous attachez à la commande:
Mais vous devez ajouter ceci après la commande à chaque fois.
Personnellement, j'aime la possibilité mentionnée par @nagul, la fonction rse ajoutée à bashrc.
Mais je veux ajouter la solution pour imprimer le code de sortie. Vous pouvez ajouter cette valeur au début de votre ligne d'invite bash:
Où EC est le code de sortie de la commande.
Je l'ai défini de la manière suivante: lorsque le code de sortie est 0, il ne sera pas imprimé, mais toute autre valeur sera imprimée avant la prochaine invite en couleur rouge.
L'astuce se fait dans ~ / .bashrc:
La ligne d'invite est définie par défaut par la variable PS1. Copiez tout ce que vous avez ici dans la variable PROMPT, puis créez la variable PS1 avec ou sans code de sortie.
Bash affichera les informations de la variable PS1 à l'invite.
la source
il y a un
annotate-output
utilitaire (devscripts
paquet Debian), si vous voulez le faire sans couleursla source