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.
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
.
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:
u
- vypíše jméno uživatele;h
- vypíše jméno hostitele;w
- vypíše jméno pracovního adresáře;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;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: