Ich möchte mein Terminal so einrichten stderr
wird in einer anderen Farbe gedruckt als stdout
; vielleicht rot. Dies würde es einfacher machen, die beiden voneinander zu unterscheiden.
Gibt es eine Möglichkeit, dies in .bashrc
zu konfigurieren ? Wenn nicht, ist das überhaupt möglich?
Hinweis :Diese Frage wurde mit einer anderen zusammengeführt, die nach stderr
fragte , stdout
und das Echo der Benutzereingabe in 3 verschiedenen Farben ausgegeben werden . Antworten können sich auf beide Fragen beziehen.
Akzeptierte Antwort:
Dies ist eine schwierigere Version von Nur stderr auf dem Bildschirm anzeigen, aber sowohl stdout als auch stderr in die Datei schreiben.
Die im Terminal ausgeführten Anwendungen verwenden einen einzigen Kanal, um mit ihm zu kommunizieren; Die Anwendungen haben zwei Ausgabeports, stdout und stderr, aber beide sind mit demselben Kanal verbunden.
Sie können einen von ihnen mit einem anderen Kanal verbinden, diesem Kanal Farbe hinzufügen und die beiden Kanäle zusammenführen, aber dies führt zu zwei Problemen:
- Die zusammengeführte Ausgabe ist möglicherweise nicht genau in der gleichen Reihenfolge wie ohne Umleitung. Dies liegt daran, dass die zusätzliche Verarbeitung auf einem der Kanäle (etwas) Zeit in Anspruch nimmt, sodass der farbige Kanal möglicherweise verzögert wird. Wenn eine Pufferung vorgenommen wird, wird die Störung schlimmer.
- Terminals verwenden farbwechselnde Escape-Sequenzen, um die Anzeigefarbe zu bestimmen, z.
␛[31m
bedeutet „auf roten Vordergrund schalten“. Dies bedeutet, dass, wenn eine Ausgabe für stdout ankommt, während eine Ausgabe für stderr angezeigt wird, die Ausgabe falsch gefärbt ist. (Noch schlimmer, wenn es mitten in einer Escape-Sequenz einen Kanalwechsel gibt, sehen Sie Müll.)
Im Prinzip wäre es möglich, ein Programm zu schreiben, das auf zwei ptys¹ synchron lauscht (d. h. keine Eingabe auf einem Kanal akzeptiert, während es die Ausgabe auf dem anderen Kanal verarbeitet) und sofort mit entsprechenden Farbänderungsanweisungen an das Terminal ausgibt. Sie würden die Fähigkeit verlieren, Programme auszuführen, die mit dem Terminal interagieren. Mir ist keine Implementierung dieser Methode bekannt.
Ein anderer möglicher Ansatz wäre, das Programm dazu zu bringen, die richtigen Farbwechselsequenzen auszugeben, indem alle libc-Funktionen, die den write
aufrufen, umgangen werden Systemaufruf in einer mit LD_PRELOAD
geladenen Bibliothek . Sehen Sie sich die Antwort von sickill für eine vorhandene Implementierung oder die Antwort von Stéphane Chazelas für einen gemischten Ansatz an, der strace
nutzt .
In der Praxis empfehle ich, falls zutreffend, stderr nach stdout umzuleiten und in einen musterbasierten Kolorierer wie colortail oder multitail oder Spezialkolorierer wie colorgcc oder colormake zu leiten.
Verwandte:Wie entferne ich /volumes/ aus dem Automator-Dienst mit einem vorhandenen Shell-Skript?¹ Pseudo-Terminals. Pipes würden aufgrund von Pufferung nicht funktionieren:Die Quelle könnte in den Puffer schreiben, was die Synchronität mit dem Kolorierer unterbrechen würde.