So drucken Sie Standardfehler in rot

14

Wie kann ich den Standardfehler in Rot in die Konsole drucken, anstatt die gleiche Farbe der Standardausgabe zu verwenden?

Ist es möglich, Gnome Terminal zu benutzen ?

Aslan986
quelle
Dieser Link könnte Ihnen helfen
devav2
Sie können dieses Verhalten für einen Befehl mit dem hiliteDienstprogramm aktivieren . Sie müssen hiliteIhren Shell-Befehl manuell voranstellen , um ihn zu verwenden, aber es ist trotzdem nützlich, wenn Sie wissen oder vermuten, dass ein Befehl Fehler ausgibt und Sie diese suchen möchten.
Rory O'Kane

Antworten:

8

Ich benutze Stderred und habe es eine gute Lösung gefunden. In der Readme- Datei heißt es:

Stderred-Hooks auf write () und eine Familie von Stream-Funktionen (fwrite, fprintf, error ...) von libc, um alle stderr-Ausgaben, die an das Terminal gesendet werden, einzufärben und so von stdout zu unterscheiden. Grundsätzlich umschließt es Text, der mit dem Deskriptor "2" in die Datei geht, mit korrekten ANSI-Escape-Codes, wodurch der Text rot wird.

Es ist als gemeinsam genutzte Bibliothek implementiert und erfordert keine Neukompilierung vorhandener Binärdateien dank der Vorlade- / Einfügefunktion dynamischer Linker.

Es wird unter Linux (mit LD_PRELOAD), FreeBSD (auch LD_PRELOAD) und OSX (mit DYLD_INSERT_LIBRARIES) unterstützt.

Es ist einfach zu kompilieren, aber Sie müssen es aus dem Quellcode erstellen, indem Sie den Anweisungen auf der Github-Site folgen :

sudo apt-get install build-essential git cmake 

Dann

git clone git://github.com/sickill/stderred.git
cd stderred

Dann

make

Der wichtigste Teil davon ist, die entsprechende Zeile zu Ihrem hinzuzufügen .bashrc; Sie müssen eine Verknüpfung zu der libstderred.soDatei im Erstellungsverzeichnis herstellen. Sie müssen den absoluten Pfad verwenden, unter dem sich das Erstellungsverzeichnis befindet (/ home / mike / src / stderred / build). Ich füge Folgendes zu meinem hinzu .bashrc:

export LD_PRELOAD="/home/mike/src/stderred/build/libstderred.so${LD_PRELOAD:+:$LD_PRELOAD}"

Wenn Sie es nicht mehr verwenden möchten, entfernen Sie die obige Zeile von Ihrem .bashrcund starten Sie das Terminal neu.

Die Ergebnisse, getestet mit nicht existierenden Dateien (es wird offensichtlich nicht funktionieren, wenn sudoes verwendet wird, da der Benutzer .bashrcnicht gelesen wird, wenn die andere Umgebung eingestellt ist):

(Übrigens es nicht dreht den Herzog @ nukem prompt rot wie die rot wurde bereits )

Bildbeschreibung hier eingeben


quelle
Ich kann nicht glauben, dass ich so viele Jahre gegangen bin, ohne zu wissen, dass es das gibt! Es ist unglaublich nützlich und sollte schon seit ungefähr hundert Jahren Teil des Betriebssystems sein. :)
Roger Dahl
6

Im Allgemeinen ja, da Gnome Terminal ein ANSI-Terminal ist und die Standard-ANSI-Escape-Codes unterstützt.

Hier ist ein Beispiel. Geben Sie dies in Ihr Terminal ein:

echo -e "\e[01;31mREDRUM\e[0m"

Die -eOption erlaubt die Interpretation von Backslash-Codes, so dass daraus \e"Esc" (Hex-Code 0x1B) wird. Alternativ können Sie die Escape-Taste auch direkt eingeben, indem Sie Folgendes drücken ctrl-V Esc:

echo  "^[[01;31mREDRUM^[[0m"

Escape und [beide bilden zusammen den Code, der vom Terminal erkannt wird. Nach dieser Sequenz müssen Sie eine durch Doppelpunkte ( ;) getrennte Liste von Attributen einfügen , die mit abgeschlossen wird m. Sehen Sie hier für alle Codes. Beispiele hierfür sind Attribute 0(alle Attribute zurücksetzen, wie Sie vielleicht oben bemerken, die Sequenz, die mein Beispiel beendet) und eine Reihe von Stilen (unterstrichen, hell, fett usw.) sowie einige Farbattribute.

In der obigen Antwort erfahren Sie, wie Sie mit Farbe arbeiten, wenn Sie ein eigenes Programm schreiben.

Wenn ich Ihre Frage jedoch richtig verstehe, möchten Sie eine visuelle Trennung für stderr und stdout aller Programme, die Sie ausführen. Dies ist nicht einfach, ohne die Ausgabe über einen Filter zu analysieren. Hier ist ein Beispiel ( hier zu finden ), wie es gemacht wird:

  1. Definieren Sie eine Funktion (Sie können sie in Ihre .bashrc-Datei einfügen):

    color() { "$@" 2>&1>&3|sed 's,.*,\x1B[31m&\x1B[0m,'>&2; } 3>&1
    
  2. Programme wie dieses starten:

    color program
    

Das Stderr aus den Programmen wird rot gefärbt.

Januar
quelle
Gibt es überhaupt eine Möglichkeit, eine Fehlermeldung aus einem beliebigen Programm einzufärben?
Luke