Geben Sie sofort an, welche Ausgabe an stderr gesendet wurde

3306
Clinton Blackmore

Bei der Automatisierung einer Aufgabe ist es sinnvoll, sie zuerst manuell zu testen. Es wäre jedoch hilfreich, wenn alle an stderr gehenden Daten sofort als solche erkannt und von den an stdout gehenden Daten unterschieden werden könnten und die gesamte Ausgabe zusammen zu führen wäre, so dass die Reihenfolge der Ereignisse offensichtlich ist.

Eine letzte Berührung, die schön wäre, wäre, wenn beim Programmende der Rückkehrcode gedruckt würde.

All diese Dinge würden bei der Automatisierung helfen. Ja, ich kann den Rückkehrcode wiederholen, wenn ein Programm beendet ist, und ja, ich kann stdout und stderr umleiten. Was mir wirklich gefällt, ist eine Shell, ein Skript oder ein einfach zu verwendender Redirector, der stdout in schwarz zeigt, stderr mit Interleaved in Rot zeigt und den Exit-Code am Ende druckt.

Gibt es so ein Biest? [Wenn es wichtig ist, verwende ich Bash 3.2 unter Mac OS X].


Update : Entschuldigung, es ist Monate her, seit ich mir das angesehen habe. Ich habe mir ein einfaches Testskript ausgedacht:

#!/usr/bin/env python import sys  print "this is stdout" print >> sys.stderr, "this is stderr" print "this is stdout again" 

In meinen Tests (und wahrscheinlich aufgrund der Art und Weise, wie die Dinge gepuffert werden) zeigen rse und hilite alles von stdout und dann alles von stderr an. Die FIFO-Methode hat die richtige Reihenfolge, scheint jedoch alles zu färben, das der stderr-Linie folgt. ind beklagte sich über meine stdin- und stderr-Zeilen und legte dann die Ausgabe von stderr zuletzt ab.

Die meisten dieser Lösungen sind praktikabel, da es nicht untypisch ist, dass nur die letzte Ausgabe an stderr gesendet wird. Dennoch wäre es schön, etwas zu haben, das etwas besser funktioniert.

8
Wenn Sie wie ich faul sind (oder schmerzende Finger haben), können Sie sich mit den folgenden Lösungen eine Subshell nehmen (z. B. rse zsh) und jetzt alle Befehle stderr colorize. bias vor 13 Jahren 0

6 Antworten auf die Frage

9
jtbandes

Ich habe gerade eine verrückte Methode mit FIFOs entwickelt.

$ mkfifo foo $ grep --color . foo & $ your_command 2>foo 

Wenn Sie die Ausgabe von stderr getrennt haben möchten, können Sie zwei separate Shells öffnen und " grep --color . foo" in einer ohne " " &ausführen. Führen Sie dann den Befehl in der anderen (immer noch mit 2>foo) aus. Sie erhalten den Stderr im grepeinen und den Stdout im Hauptbereich.

Dies funktioniert, weil die Ausgabe von stderr durch den FIFO in geleitet wird grep --color, dessen Standardfarbe rot ist (zumindest für mich). Wenn Sie fertig sind, rmbrauchen Sie nur den FIFO ( rm foo).

Vorsichtsmaßnahme : Ich bin mir nicht sicher, wie die Ausgabereihenfolge damit umgehen wird, Sie müssen es testen.

Das ist ziemlich glatt. Clinton Blackmore vor 14 Jahren 0
7
nagul

Ja das ist möglich. Schauen Sie sich den Abschnitt "STDERR rot machen" auf dieser Site für ein Arbeitsbeispiel an.

Der grundlegende Code ist dieser

# 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 } 

Eine kurze Erklärung finden Sie in der Funktion selbst. Was ist tut, ist zu bewegen STDOUT und STDERR über, so sed wird STDERR in 1, Farben es, und tauscht sie dann zurück. Stellen Sie sich File Stream 3 hier als temporäre Variable vor.

Der Anruf ist ziemlich einfach

rse commands 

Bestimmte Aufrufe funktionieren jedoch nicht wie erwartet; Die Vorbehalte finden Sie alle auf der verlinkten Seite.

Ich denke, es ist auch möglich, mit einer Lösung des Formulars zu kommen

commands | rse 

Dabei wird die Ausgabe gefärbt.

Ich habe auch dieses hilite Projekt gefunden, das dies zu tun scheint. Ich habe es nicht ausprobiert, aber es ist vielleicht das, wonach Sie suchen.

hilite ist ein kleines Hilfsprogramm, das den von Ihnen angegebenen Befehl ausführt und alles hervorhebt, das in stderr gedruckt wird. Es wurde hauptsächlich für Builds entwickelt, um Warnungen und Fehler wie ein Klischee hervorzurufen.

Andere verwandte Projekte:

rse und hilite sind ziemlich nahe an dem, was ich will. Clinton Blackmore vor 14 Jahren 0
3
sickill

Sie können stderred auch auschecken: https://github.com/sickill/stderred

Leider bricht für Mac-Benutzer wie das OP die Unterbrechung "open" und "mvim". AlcubierreDrive vor 12 Jahren 0
Dies funktioniert sehr gut und erhält die Ausgabereihenfolge aufgrund der Funktionsweise in der richtigen Weise. Richten Sie es einmal ein und aktivieren Sie es in Ihrem Profil. Sie erhalten rote Nachrichten, wenn in stderr geschrieben wird. Clinton Blackmore vor 11 Jahren 0
@JonRodriguez, es scheint mir, dass das [Problem mit dem Befehl "Öffnen" behoben wurde] (https://github.com/sickill/stderred/issues/11). Clinton Blackmore vor 11 Jahren 1
1
Thomas

Ein anderes Programm ist ind:

http: // www.habets.pp.se/synscan/programs.php?prog=ind (Sie müssen den Hyperlink selbst zusammenstellen, ich habe nicht genug Punkte für mehr als eine Antwort). Dort gibt es einen Screenshot und sogar einen Screencast.

Es führt den Teilprozess in einem pty aus, was die anderen wahrscheinlich nicht tun. Dies kann wichtig sein, wenn die Reihenfolge von Belang ist (häufig ist das der Fall), da stderr sofort in Terminals gespült wird und stdout vollständig gepuffert ist, wenn es nicht tty ist.

Eine vollständige Erklärung finden Sie hier: http://blog.habets.pp.se/2008/06/Buffering-in-pipes

Außerdem arbeitet ind mit interaktiven Programmen und Steuerzeichen. Bash funktioniert wie gewohnt, wenn mit "ind bash -i" begonnen wird.

Dies könnte funktionieren, um Farben zu erhalten, während Ctrl-P usw. erhalten bleibt.

ind -P $(echo -ne '\033[31;1m') -p $(echo -ne '\033[0m') bash -i 
1
srnka

Hier sind viele Antworten zum Hervorheben der Ausgabe von stderr. Ich kann nur eine recht einfache hinzufügen - in einer Zeile, die Sie an den Befehl anhängen:

command 2> >(while read line; do echo -e "\e[01;31m$line\e[0m"; done) 

Sie müssen dies jedoch jedes Mal nach dem Befehl hinzufügen.

Ich persönlich mag die von @nagul erwähnte Möglichkeit, die rse-Funktion zu bashrc hinzuzufügen.

Ich möchte jedoch die Lösung zum Drucken des Exit-Codes hinzufügen. Sie können diesen Wert am Anfang Ihrer Bash-Eingabeaufforderungszeile hinzufügen:

hostname$ command Some error occurred. Returned exit code. EC hostname$ 

Wo ist EC Exit-Code des Befehls.

Ich habe es so eingestellt, dass bei einem Exit-Code 0 nicht gedruckt wird, sondern jeder andere Wert vor der nächsten Eingabeaufforderung in roter Farbe gedruckt wird.

Der ganze Trick wird in ~ / .bashrc ausgeführt:

my_prompt() { EXITSTATUS="$?" RED="\[\033[1;31m\]" OFF="\[\033[m\]"  PROMPT="$\h \$ "  if [ "$" -eq 0 ]; then PS1="$" else PS1="$$EXITSTATUS$ $" fi }  PROMPT_COMMAND=my_prompt 

Die Aufforderungszeile ist standardmäßig durch die PS1-Variable definiert. Kopieren Sie das, was Sie hier haben, in die Variable PROMPT und erstellen Sie dann die Variable PS1 mit oder ohne Exit-Code.

Bash zeigt die Informationen in der PS1-Variablen in der Eingabeaufforderung an.

Genau das habe ich gesucht, danke! Dylon vor 6 Jahren 0
1
mykhal

Es gibt ein annotate-outputHilfsprogramm ( devscriptsDebian-Paket), wenn Sie es ohne Farben tun möchten

$ annotate-output /tmp/test.py  14:24:57 I: Started /tmp/test.py 14:24:57 E: this is stderr 14:24:57 O: this is stdout 14:24:57 O: this is stdout again 14:24:57 I: Finished with exitcode 0