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; "example@unixlinux.online" 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."example@unixlinux.online"— Provede argumenty funkce jako nový příkaz."example@unixlinux.online"je ekvivalentní"$1" "$2" ...2>&1— Přesměrujestderrpříkazu nastdouttakže se změní nased'sstdin.>&3— Zkratka pro1>&3, toto přesměrujestdoutna nový deskriptor dočasného souboru3.3je směrován zpět dostdoutpozději.sed ...— Kvůli přesměrování výšesed'sstdinjestderrprovedené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é&—sednahradit 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'sstdoutnastderr.3>&1— Přesměruje deskriptor dočasného souboru3zpět dostdout.
Zde je rozšíření stejného konceptu, díky kterému je STDOUT také zelený:
function stdred() (
set -o pipefail;
(
"example@unixlinux.online" 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.