Způsoby platby Abuse

Barvy terminálu Linux

26.09.2021, 22:47

Výhodou Linuxu je, že si můžete cokoli přizpůsobit, pokud chcete. To je výhoda projektivních systémů oproti procedurálním. Jedná se o jakýsi konstruktor skládající se z jednotlivých bloků, z nichž každý lze libovolně přizpůsobit.

Zvláště zajímavé je, když nekopírujete jen hotová řešení, ale snažíte se pochopit, co a jak funguje. A i při řešení nezávažné úlohy se dozvíte něco nového.

Vybarvování barev výstupu

Chcete například upravit barvy linuxového terminálu ve výstupu příkazu ls.

Z dokumentace k příkazu ls pochopíte, že nastavení barev výstupu se provádí pomocí nástroje dircolors, který buď nastavuje parametry barev z vlastní databáze, nebo je přebírá ze souboru ~/.dircolors. Bylo také zmíněno, že inicializace použití barev se provádí prostřednictvím ~/.bashrc, souboru s nastavením shellu, a že samotné parametry se definují prostřednictvím proměnné LC_COLORS.

V souboru .bashrc byl nalezen následující skript:

Jeho podstatou je kontrola přítomnosti nástroje dircolors v systému, přiřazení hodnoty proměnné a v případě úspěchu použití parametru --color=auto při každém volání ls.

Pokud spustíte nástroj dircolors, vypíše hodnotu proměnné LC_COLOR.

Hodnotu proměnné LC_COLORS je možné vypsat také ve strukturované podobě, a to zadáním klíče:

$ dircolors -p

Protože je výstup dlouhý, nebudu ho zde uvádět.

Pokud přesměrujete výstup dircolors -p > ~/.dircolors, vytvoří se strukturovaný soubor, ze kterého se převezme nastavení barev. Úpravou tohoto souboru a nastavením barev pro výstup ls.

Ve vytvořeném souboru .dircolors se nachází nápověda:

Nastavením posloupnosti přes středník získáme v linuxové konzoli barvu, kterou potřebujeme, podle uvedeného seznamu. Barvy linuxového terminálu jsou od 30 do 37 pro barvu písma a od 40 do 47 pro barvu pozadí. Například:

DIR 01;34 znamená, že názvy adresářů budou tučné a modré.

Tímto způsobem však získáte pouze osm barev, přičemž moderní emulátory terminálů jich umí zobrazit nejméně 256.

Existují i jiné způsoby nastavení barev. Například EXEC 38;5;208;1 dává oranžové tlusté písmo pro spustitelné soubory.

Abychom nemuseli procházet linuxové barvy ručně, existuje připravená tabulka barev

Dosazením hodnoty barvy 38;5;x - kde x je barva z tabulky, získáme potřebný výsledek. Dostaneme něco takového:

Jak to funguje? Jde o to, že nastavení barvy výstupních informací v emulátoru terminálu se provádí pomocí escape kódů ANSI. Jedná se o určitou sekvenci znaků, která se nevytiskne na obrazovku, ale ovlivní výstup. Nazývá se tak proto, že začíná [ - kódem "Esc". Protože existuje mnoho terminálů a emulátorů terminálů, jsou tyto řídicí kódy standardizovány. Barevné ovládání prostřednictvím posloupnosti od 30 do 37 je standardem ECMA-48. Informace o něm najdete v části konzolové_kódy.

Vybarvení řádku pozvánky

Jakmile pochopíte, jak nastavit barvy linuxu prostřednictvím esc kódů, je snadné změnit design a barvu výzvy. Za jeho výstup je zodpovědná proměnná PS1, definovaná v souboru ~/.bashrc.

V Linux Mintu vypadá skript pro její inicializaci takto:

To znamená, že se nejprve zjistí, zda byl skript spuštěn rootem nebo běžným uživatelem. Protože v naprosté většině případů jde o druhou možnost, je třeba upravit řádek následující za prvním 'else'. Formát řádku je rozluštěn v dokumentaci k bashi, v části "Promting". Vyplývá z něj, že sekvence esc by měla začínat znakem "[" a končit znakem "]". Tedy:

  • [[01;32m]] - nastaví zelenou barvu;
  • u - vypíše jméno uživatele;
  • h - vypíše jméno hostitele;
  • [[00m] - vymaže nastavené atributy;
  • [[01;34m] - nastaví modrou barvu;
  • w - vypíše jméno pracovního adresáře;
  • Hi - příklad, že lze vypsat libovolný odvozený text.

Co dalšího může být vypsáno ve výzvě:

  • d - datum ve formátu "st 28. prosince";
  • A - čas, ve 24hodinovém formátu;
  • ! - číslo aktuálního příkazu v historii;
  • - přenos výstupu na jiný řádek;

Představíme si ještě něco zajímavého:

PS1='${debian_chroot:+($debian_chroot)}[[01;32m]Matrix has you,u![[00m] [[01;34m]Blue pill[[00m] or [[31m]red?[[00m]--->$ '

A řádek výzvy bude vypadat takto: