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

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

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 — Leitet stderr um des Befehls an stdout sodass daraus sed wird ist stdin .
  • >&3 — Abkürzung für 1>&3 , leitet dies stdout um zu einem neuen temporären Dateideskriptor 3 . 3 wird zurück in stdout geleitet später.
  • sed ... — Wegen der obigen Weiterleitungen sed ist stdin ist der stderr 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
  • & — Die sed 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ür 1>&2 , leitet dies sed um ist stdout bis stderr .
  • 3>&1 — Leitet den temporären Dateideskriptor 3 um zurück in stdout .

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
Linux
  1. So leiten Sie die Ausgabe in eine Datei und Stdout in Linux um

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

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

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

  5. Leiten Sie die gesamte Ausgabe in eine Datei in Bash um

Verwirrt über stdin, stdout und stderr?

Ist es sicher, die Pufferung mit stdout und stderr zu deaktivieren?

Wiederherstellen von stdout und stderr auf die Standardwerte

Ist es möglich, dass der Linux-Dateideskriptor 0 1 2 nicht für stdin, stdout und stderr gilt?

Stellen Sie fest, ob die Ausgabe stdout oder stderr ist

Erfassen von STDERR und STDOUT in einer Datei mit tee