Ich suche nach einer Möglichkeit, stdout und stderr visuell zu trennen, damit sie nicht ineinander greifen und einfach identifiziert werden können. Im Idealfall haben stdout und stderr separate Bereiche auf dem Bildschirm, in denen sie angezeigt werden, z. B. in verschiedenen Spalten. Zum Beispiel eine Ausgabe, die so ausgesehen hätte:
~$ some command
some useful output info
ERROR: an error
more output
ERROR: has occurred
another message
~$
würde stattdessen so aussehen:
~$ some command |
some useful output info |
more output | ERROR: an error
another message | ERROR: has occurred
~$ |
command-line
terminal
Zoey Hewll
quelle
quelle
Antworten:
Sie könnten die
screen
vertikale Teilungsfunktion von GNU verwenden :Zum Beispiel als:
Die Idee ist, dass der Bildschirm mit einer temporären Konfigurationsdatei ausgeführt wird, die zwei Bildschirmfenster in einem vertikal geteilten Layout startet. Im ersten führen wir Ihren Befehl mit dem mit dem zweiten verbundenen stderr aus.
Wir verwenden eine Named Pipe für das zweite Fenster, um dem ersten sein tty-Gerät mitzuteilen, und für das erste, um dem zweiten mitzuteilen, wann der Befehl ausgeführt wurde.
Der andere Vorteil gegenüber Pipe-basierten Ansätzen besteht darin, dass stdout und stderr des Befehls weiterhin mit tty-Geräten verbunden sind, sodass die Pufferung nicht beeinträchtigt wird. Beide Fenster können auch unabhängig voneinander nach oben und unten gescrollt werden (im Kopiermodus
screen
).Wenn Sie eine Shell wie
bash
interaktiv mit diesem Skript ausführen , werden Sie feststellen, dass die Eingabeaufforderung im zweiten Fenster angezeigt wird, während die Shell liest, was Sie im ersten Fenster eingeben, während diese Shells ihre Eingabeaufforderung auf stderr ausgeben.Im Fall von
bash
wird das Echo Ihrer Eingabe auch im zweiten Fenster angezeigt, da dieses Echo von der Shell (im Fall von readlinebash
) auch auf stderr ausgegeben wird . Bei einigen anderen Shells mögenksh93
, zeigt es auf dem ersten Fenster ( Echo Ausgang vom Terminal Gerätetreiber, nicht die Shell), wenn Sie die Schale in setzenemacs
odervi
Modus mitset -o emacs
oderset -o vi
.quelle
Dies ist eine hässliche Lösung, die auf dem
annotate-output
Skript von Debian ANNOTATE-OUTPUT (1) basiert . Ich bin mir nicht sicher, ob dies das ist, wonach Sie suchen, aber es könnte etwas sein, mit dem Sie beginnen:Sie können es mit
./this_script another_script
oder testencommand
.quelle
Ich werde versuchen, den folgenden Teil Ihrer Frage zu analysieren:
Wenn man aufteilen wollte, was Sie wollen, ist:
1) Der
stdout
Stream würde nicht jede Zeile mit einem,CR LF
sondern mit einem '|' Charakter. Dies würde die beiden Ströme natürlich nicht zusammen ausrichten, und eine Ausrichtung kommt nicht in Frage, da die Länge zukünftiger Zeilen, die zu den Strömen hinzugefügt werden, vorhergesagt werden müsstestdout
, was natürlich unmöglich ist.2) Unter der Annahme, dass wir die Ausrichtung vergessen haben, geben wir das Ergebnis einfach aus,
stderr
nachdem es von einer Pipeline verarbeitet wurde, die am Anfang jeder Zeile "ERROR:" hinzufügt. Ich nehme an, dass dies recht einfach ist, indem Sie ein einfaches Skript erstellen und sicherstellen, dass esstderr
immer durch dieses Skript geht.Aber das würde eine Ausgabe wie diese erzeugen:
Was ist nicht wirklich hilfreich, oder? Auch ich glaube nicht, es ist das, was du auch suchst!
Das Problem mit der anfänglichen Frage ist meiner Meinung nach, dass Sie die serielle Natur jeder in einem Stream angehängten Zeile nicht berücksichtigen, in Verbindung mit der Tatsache, dass beide Streams möglicherweise asynchron geschrieben werden.
Ich glaube, die nächstmögliche Lösung wäre die Verwendung
ncurses
.Sehen.
[ http://www.tldp.org/HOWTO/html_single/NCURSES-Programming-HOWTO/]
[ http://invisible-island.net/ncurses/ncurses-intro.html#updating]
Um das zu tun, was Sie wollen, müssen Sie beide Streams puffern und sie kombinieren, um einen dritten Puffer zu erstellen, der Elemente aus beiden Puffern übernimmt. Entleeren Sie dann den dritten Puffer im Terminalbildschirm, indem Sie den Terminalbildschirm löschen und ihn bei jedem Wechsel des dritten Puffers neu streichen. Aber so
ncurses
funktioniert es. Warum also das Rad neu erfinden und nicht von dort aufgreifen?In jedem Fall müssten Sie übernehmen, dass der Terminalbildschirm komplett lackiert ist ! Richten Sie den Text in der neu gedruckten Version des Bildschirms nach Ihren Wünschen aus. Ähnlich wie ein Videospiel mit Terminalcharakteren.
Ich hoffe, meine Antwort wird hilfreich sein, um die Grenzen Ihrer Sucht zu klären ...
Entschuldigen Sie, dass ich dies wiederhole, aber das größte Problem bei dem, was Sie gezeigt haben, ist, wie der "Prozessor" der
stdout
und derstderr
Streams die Länge der hinzugefügten zukünftigen Zeilen im Voraus kennt, um sie richtig auszurichten.quelle