Wenn Sie eine Aufgabe automatisieren, ist es sinnvoll, sie zuerst manuell zu testen. Es wäre jedoch hilfreich, wenn Daten, die an stderr gesendet werden, sofort als solche erkennbar und von den Daten, die an stdout gesendet werden, unterscheidbar wären, und alle Ausgaben zusammen zu haben, damit die Reihenfolge der Ereignisse offensichtlich ist.
Eine letzte Berührung, die schön wäre, wäre, wenn beim Beenden des Programms 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 ich wirklich mag, ist eine Shell, ein Skript oder ein benutzerfreundlicher Redirector, der stdout in Schwarz anzeigt, stderr in Rot verschachtelt zeigt und den Exit-Code am Ende druckt.
Gibt es so ein Biest? [Wenn es darauf ankommt, verwende ich Bash 3.2 unter Mac OS X].
Update : Es ist leider Monate her, seit ich mir das angeschaut 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 sind) zeigen rse und hilite alles von stdout und dann alles von stderr an. Die fifo-Methode stimmt die Reihenfolge, scheint aber alles zu färben, was der stderr-Linie folgt. ind beschwerte sich über meine stdin und stderr Zeilen und setzte dann die Ausgabe von stderr zuletzt.
Die meisten dieser Lösungen sind funktionsfähig, da es nicht untypisch ist, dass nur die letzte Ausgabe an stderr gesendet wird. Trotzdem wäre es schön, etwas zu haben, das etwas besser funktioniert.
Antworten:
Sie können auch stderred auschecken: https://github.com/sickill/stderred
quelle
Ich habe gerade eine verrückte Methode mit FIFOs entwickelt.
Wenn Sie möchten, dass die stderr-Ausgabe separat ausgeführt wird, können Sie zwei separate Shells öffnen und "
grep --color . foo
" in einer ohne die&
ausführen und dann den Befehl in der anderen ausführen (immer noch mit der2>foo
). Sie erhalten den stderr imgrep
einen und den stdout im wichtigsten.Dies funktioniert, weil die stderr-Ausgabe über das FIFO in geleitet wird
grep --color
, dessen Standardfarbe Rot ist (zumindest für mich). Wenn Sie fertig sind, nurrm
das FIFO (rm foo
).Vorsichtsmaßnahme : Ich bin mir wirklich nicht sicher, wie dies mit der Ausgabereihenfolge umgehen soll. Sie müssen es testen.
quelle
Ja, das ist möglich. Ein funktionierendes Beispiel finden Sie im Abschnitt "STDERR rot machen" auf dieser Site .
Der Grundcode ist dieser
Eine kurze Erklärung finden Sie in der Funktion selbst. Was bewegt wird, ist STDOUT und STDERR zu bewegen, also erhält sed STDERR in 1, färbt es und tauscht es dann zurück. Stellen Sie sich File Stream 3 hier als temporäre Variable vor.
Der Anruf ist ziemlich einfach
Bestimmte Aufrufe funktionieren jedoch nicht wie erwartet. Die Vorbehalte finden Sie alle auf der verlinkten Seite.
Übrigens denke ich, dass es auch möglich ist, eine Lösung der Form zu finden
Dabei färbt rse die Ausgabe ein.
Ich fand auch dieses hilite Projekt , das dies zu tun scheint. Ich habe es nicht ausprobiert, aber es könnte das sein, wonach Sie suchen.
Andere verwandte Projekte:
quelle
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 einen pro Antwort). Dort gibt es einen Screenshot und sogar einen Screencast.
Es führt den Unterprozess in einem Pty aus, was die anderen wahrscheinlich nicht tun. Dies kann wichtig sein, wo die Reihenfolge wichtig ist (was häufig der Fall ist), da stderr sofort in Terminals gespült wird und stdout vollständig gepuffert wird, wenn es kein tty ist.
Eine vollständige Erklärung finden Sie hier: http://blog.habets.pp.se/2008/06/Buffering-in-pipes
Ind arbeitet auch mit interaktiven Programmen und Steuerzeichen. Bash funktioniert wie gewohnt, wenn mit "ind bash -i" begonnen wird.
Dies könnte funktionieren, um Ihnen Farben zu geben, während Strg-P et al.
quelle
Hier finden Sie viele Antworten zum Hervorheben der stderr-Ausgabe. Ich kann nur eine ziemlich einfache hinzufügen - in einer Zeile, die Sie dem Befehl hinzufügen:
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.
Aber ich möchte die Lösung zum Drucken des Exit-Codes hinzufügen. Sie können diesen Wert am Anfang Ihrer Bash-Eingabeaufforderungszeile hinzufügen:
Wobei EC der Exit-Code des Befehls ist.
Ich habe es so eingestellt, dass wenn der Exit-Code 0 ist, er nicht gedruckt wird, aber jeder andere Wert vor der nächsten Eingabeaufforderung in roter Farbe gedruckt wird.
Der ganze Trick wird in ~ / .bashrc gemacht:
Die Eingabeaufforderungszeile wird standardmäßig durch die Variable PS1 definiert. Kopiere alles, was du hier hast, in die Variable PROMPT und erstelle dann die PS1-Variable mit oder ohne Exit-Code.
Bash zeigt die Informationen in der PS1-Variablen in der Eingabeaufforderung an.
quelle
Es gibt ein
annotate-output
Dienstprogramm (devscripts
Debian-Paket), wenn Sie es ohne Farben tun möchtenquelle