GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Konfigurieren Sie die Shell, um Stderr und Stdout in verschiedenen Farben zu drucken?

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.


Linux
  1. Wie weist man die Ausgabe eines Befehls einer Shell-Variablen zu?

  2. Was ist mit der Verbindung von Stdout und Stdin gemeint?

  3. Wie kann man feststellen, ob die Ausgabe eines Befehls oder Shell-Skripts Stdout oder Stderr ist?

  4. Wie installiere und konfiguriere ich den HAProxy unter CentOS?

  5. Ist es möglich, die Ausgabe von stdout und stderr in XTerm oder Konsole in unterschiedlichen Farben auszuführen?

Wie kann man Stderr und Stdout in verschiedene Dateien umleiten und auch im Terminal anzeigen?

Nur Stderr auf dem Bildschirm anzeigen, aber sowohl Stdout als auch Stderr in Datei schreiben?

So leiten Sie die Ausgabe in eine Datei und stdout um

Shell:leite stdout nach /dev/null und stderr nach stdout um

Warum geht die Ausgabe einiger Linux-Programme weder an STDOUT noch an STDERR?

Unterschiedliche Farbe für Befehl und Ausgabe