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
— Leitetstderr
um des Befehls anstdout
sodass daraussed
wird iststdin
.>&3
— Abkürzung für1>&3
, leitet diesstdout
um zu einem neuen temporären Dateideskriptor3
.3
wird zurück instdout
geleitet später.sed ...
— Wegen der obigen Weiterleitungensed
iststdin
ist derstderr
des 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&
— Diesed
Zeichen 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 diessed
um iststdout
bisstderr
.3>&1
— Leitet den temporären Dateideskriptor3
um 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