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ěrujestderr
příkazu nastdout
takže se změní nased
'sstdin
.>&3
— Zkratka pro1>&3
, toto přesměrujestdout
na nový deskriptor dočasného souboru3
.3
je směrován zpět dostdout
později.sed ...
— Kvůli přesměrování výšesed
'sstdin
jestderr
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 pro1>&2
, toto přesměrujesed
'sstdout
nastderr
.3>&1
— Přesměruje deskriptor dočasného souboru3
zpět dostdout
.
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.