GNU/Linux >> Znalost Linux >  >> Linux

Je možné, aby výstup stdout a stderr měl různé barvy v XTerm nebo Konsole?

Zde je řešení, které kombinuje některé z již představených dobrých nápadů.

Vytvořte funkci ve skriptu bash:

color() ( set -o pipefail; "[email protected]" 2>&1>&3 | sed $'s,.*,\e[31m&\e[m,' >&2 ) 3>&1

Použijte jej takto:

$ color command -program -args

Zobrazí se stderr příkazu v červené.

Pokračujte ve čtení pro vysvětlení, jak to funguje. Tento příkaz demonstruje několik zajímavých funkcí.

  • color()... — Vytvoří bash funkci s názvem color.
  • set -o pipefail — Toto je volba shellu, která zachovává návratový kód chyby příkazu, jehož výstup je přenesen do jiného příkazu. To se provádí v subshell, který je vytvořen pomocí závorek, aby nedošlo ke změně možnosti pipefail ve vnějším shellu.
  • "[email protected]" — Provede argumenty funkce jako nový příkaz. "[email protected]" je ekvivalentní "$1" "$2" ...
  • 2>&1 — Přesměruje stderr příkazu na stdout takže se změní na sed 's stdin .
  • >&3 — Zkratka pro 1>&3 , toto přesměruje stdout na nový deskriptor dočasného souboru 3 . 3 je směrován zpět do stdout později.
  • sed ... — Kvůli přesměrování výše sed 's stdin je stderr provedeného příkazu. Jeho funkcí je obklopit každý řádek barevnými kódy.
  • $'...' Konstrukce bash, která způsobí, že porozumí znakům uniklým zpětným lomítkem
  • .* — Odpovídá celému řádku.
  • \e[31m — Escape sekvence ANSI, která způsobí, že následující znaky budou červené
  • &sed nahradit znak, který se rozšíří na celý odpovídající řetězec (v tomto případě celý řádek).
  • \e[m — Escape sekvence ANSI, která resetuje barvu.
  • >&2 — Zkratka pro 1>&2 , toto přesměruje sed 's stdout na stderr .
  • 3>&1 — Přesměruje deskriptor dočasného souboru 3 zpět do stdout .

Zde je rozšíření stejného konceptu, díky kterému je STDOUT také zelený:

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,'
)

Můžete se také podívat na stderred:https://github.com/sickill/stderred


Nevidím, že by to emulátor terminálu mohl nějak udělat.

Rozhraní mezi emulátorem terminálu a shellem/aplikací je přes pseudo-tty, kde je emulátor terminálu na hlavní straně a shell/aplikace na druhé. Shell/aplikace má stdout i stderr připojené ke stejnému pty, takže když emulátor terminálu čte z pty výstup shellu/aplikace, už nedokáže zjistit, který byl zapsán do stdout a který do stderr.

Budete muset použít jedno z řešení, které zachytí data mezi aplikací a slave-pty a vloží únikové kódy pro ovládání výstupu terminálu colo(u)r.


Linux
  1. Jak přesměrovat výstup do souboru a Stdout v Linuxu

  2. Nakonfigurovat Shell pro tisk Stderr a Stdout v různých barvách?

  3. Jak přesměrovat Stderr a Stdout na různé soubory a také zobrazit v terminálu?

  1. Jak přesměrovat stderr a stdout na různé soubory ve stejném řádku ve skriptu?

  2. Propojení stdout a stderr uvnitř pravidla Makefile

  3. Obnovení stdout a stderr na výchozí hodnotu

  1. Je možné, že linuxový deskriptor souboru 0 1 2 není pro stdin, stdout a stderr?

  2. Určete, zda je výstup stdout nebo stderr

  3. Zachycení STDERR a STDOUT do souboru pomocí tee