Hier ist eine Lösung, die einige der bereits vorgestellten guten Ideen kombiniert.
Erstellen Sie eine Funktion in einem Bash-Skript:
color() ( set -o pipefail; "[email protected]" 2>&1>&3 | sed $'s,.*,\e[31m&\e[m,' >&2 ) 3>&1
Verwenden Sie es wie folgt:
$ color command -program -args
Es zeigt den stderr des Befehls in rot.
Lesen Sie weiter, um zu erfahren, wie es funktioniert. Dieser Befehl zeigt einige interessante Funktionen.
color()...— Erstellt eine Bash-Funktion namens color.set -o pipefail— Dies ist eine Shell-Option, die den Fehlerrückgabecode eines Befehls beibehält, dessen Ausgabe in einen anderen Befehl geleitet wird. Dies geschieht in einer Subshell, die durch die Klammern erzeugt wird, um die Pipefail-Option in der äußeren Shell nicht zu verändern."[email protected]"— Führt die Argumente der Funktion als neuen Befehl aus."[email protected]"entspricht"$1" "$2" ...2>&1— Leitetstderrum des Befehls anstdoutsodass daraussedwird iststdin.>&3— Abkürzung für1>&3, leitet diesstdoutum zu einem neuen temporären Dateideskriptor3.3wird zurück instdoutgeleitet später.sed ...— Wegen der obigen Weiterleitungensediststdinist derstderrdes ausgeführten Befehls. Seine Funktion besteht darin, jede Zeile mit Farbcodes zu umgeben.$'...'Ein Bash-Konstrukt, das dafür sorgt, dass Backslash-Escape-Zeichen verstanden werden.*— Stimmt mit der gesamten Zeile überein.\e[31m— Die ANSI-Escape-Sequenz, die bewirkt, dass die folgenden Zeichen rot sind&— DiesedZeichen ersetzen, das auf die gesamte übereinstimmende Zeichenfolge (in diesem Fall die gesamte Zeile) erweitert wird.\e[m— Die ANSI-Escape-Sequenz, die die Farbe zurücksetzt.>&2— Abkürzung für1>&2, leitet diessedum iststdoutbisstderr.3>&1— Leitet den temporären Dateideskriptor3um zurück instdout.
Hier ist eine Erweiterung desselben Konzepts, das auch STDOUT grün macht:
function stdred() (
set -o pipefail;
(
"[email protected]" 2>&1>&3 |
sed $'s,.*,\e[31m&\e[m,' >&2
) 3>&1 |
sed $'s,.*,\e[32m&\e[m,'
)
Sie können sich auch stderred ansehen:https://github.com/sickill/stderred
Ich sehe keine Möglichkeit für den Terminal-Emulator, dies zu tun.
Die Schnittstelle zwischen dem Terminal-Emulator und der Shell/App erfolgt über ein Pseudo-TTY, wobei sich der Terminal-Emulator auf der Master-Seite und die Shell/App auf der anderen Seite befindet. Die Shell/App hat sowohl stdout als auch stderr mit demselben pty verbunden, so dass der Terminal-Emulator, wenn er aus dem pty für die Shell-/App-Ausgabe liest, nicht mehr erkennen kann, was auf stdout und was auf stderr geschrieben wurde.
Sie müssen eine der Lösungen verwenden, die die Daten zwischen der Anwendung und dem Slave-pty abfängt und Escape-Codes einfügt, um die Terminalausgabe colo(u)r.
zu steuern