GNU/Linux >> Znalost Linux >  >> Linux

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

Chci svůj terminál nastavit tak, aby stderr je vytištěn v jiné barvě než stdout; možná červená. To by usnadnilo rozlišení obou.

Existuje způsob, jak to nakonfigurovat v .bashrc ? Pokud ne, je to vůbec možné?

Poznámka :Tato otázka byla sloučena s jinou, která požadovala stderr , stdout a echo vstupu uživatele být výstup ve 3 různých barvách . Odpovědi se mohou týkat obou otázek.

Přijatá odpověď:

Toto je těžší verze Zobrazit na obrazovce pouze stderr, ale do souboru zapište stdout i stderr.

Aplikace běžící v terminálu používají ke komunikaci s terminálem jeden kanál; aplikace mají dva výstupní porty, stdout a stderr, ale oba jsou připojeny ke stejnému kanálu.

Jeden z nich můžete připojit k jinému kanálu, přidat do tohoto kanálu barvu a sloučit dva kanály, ale způsobí to dva problémy:

  • Sloučený výstup nemusí být přesně ve stejném pořadí, jako kdyby nedošlo k žádnému přesměrování. Důvodem je, že přidané zpracování na jednom z kanálů trvá (trochu) času, takže barevný kanál může být zpožděn. Pokud se provede nějaké vyrovnávací paměti, porucha se zhorší.
  • Terminály používají k určení barvy zobrazení sekvence escape měnící barvu, např. ␛[31m znamená „přepnout do červeného popředí“. To znamená, že pokud nějaký výstup určený pro stdout dorazí právě ve chvíli, kdy se zobrazuje nějaký výstup pro stderr, výstup bude mít jinou barvu. (Ještě horší je, že pokud je uprostřed únikové sekvence přepínač kanálu, uvidíte odpad.)

V zásadě by bylo možné napsat program, který naslouchá na dvou ptys¹, synchronně (tj. nebude přijímat vstup na jednom kanálu, zatímco zpracovává výstup na druhém kanálu) a okamžitě vysílá na terminál s příslušnými instrukcemi pro změnu barvy. Ztratili byste možnost spouštět programy, které komunikují s terminálem. Nevím o žádné implementaci této metody.

Dalším možným přístupem by bylo přimět program, aby vydával správné sekvence měnící barvy, a to zapojením všech funkcí libc, které volají write systémové volání v knihovně načtené pomocí LD_PRELOAD . Podívejte se na odpověď Sickilla pro existující implementaci nebo odpověď Stéphana Chazelase na smíšený přístup, který využívá strace .

V praxi, pokud je to možné, navrhuji přesměrovat stderr na stdout a použít vzorový colorizer, jako je colortail nebo multitail, nebo speciální kolorizéry, jako colorgcc nebo colormake.

Související:Jak odstranit /volumes/ ze služby automatu pomocí existujícího shell skriptu?

¹ pseudoterminály. Pipes by nefungovaly kvůli ukládání do vyrovnávací paměti:zdroj by mohl zapisovat do vyrovnávací paměti, což by narušilo synchronicitu s colorizerem.


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

  2. Jak přiřadit výstup příkazu proměnné shellu?

  3. Výstup do Stdout a zároveň Grep do souboru?

  1. Co znamená propojení Stdout a Stdin?

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

  3. Jak zjistit, zda je výstup příkazového nebo shellového skriptu Stdout nebo Stderr?

  1. Zobrazit na obrazovce pouze Stderr, ale zapsat do souboru Stdout i Stderr?

  2. Jak nainstalovat a nakonfigurovat HAProxy na CentOS?

  3. Jak přesměrovat výstup do souboru a stdout