Vývoj vanilkové příchuti Linuxu: Knihy kouzel byl 1. března 2025
ukončen. Tento text je zachován jako historický, ale chyby již nejsou
opravovány. Odnože projektu pod kompatibilní licencí jsou vítány.
Tato kapitola pokrývá způsoby, kterými můžete učinit okno emulátoru terminálu
praktičtější, barevnější a méně jednotvárné, aniž byste musel/a opustit
příkazový interpret bash – v linuxu můžete nastavit barvu písma či pozadí, titulek,
výzvu intepretu či vypsat ozdobné nápisy.
Barva písma a pozadí se ve skutečnosti nastavuje vypsáním takzvaných escape sekvencí,
což jsou zvláštní řídicí sekvence bajtů, kterým daný terminál rozumí
a místo vypsání něčeho na obrazovku vykoná akci, která je v sekvenci zakódovaná.
Abychom se tyto sekvence nemuseli učit, používáme místo nich moderní příkaz „tput“,
který načte příslušnou sekvenci ze své databáze a vypíše ji na svůj standardní výstup.
Tento výstup můžeme buď uložit do proměnné pro pozdější použití, nebo vypsat
na terminál přímo. Uložení do souboru není vhodné, protože v jiném terminálu
by se mohla sekvence lišit.
Tato verze kapitoly se omezuje na sekvence široce podporované většinou
emulátorů terminálu. Kde není dostupná podpora v textovém režimu,
bude to zmíněno. Dále nepokrývá podporu šestnácti milionů barev.
Výzva terminálu (zkráceně „výzva“) je řetězec, který interpret příkazové řádky (v našem případě bash) vypisuje před, během nebo po přijetí příkazu od uživatele (tzn. v interaktivním režimu). V interpretu „bash“ se rozeznávají tři druhy výzvy a jejich šablony jsou uloženy v proměnných PS0, PS1 a PS2: hlavní výzva (PS1) značí, že bash očekává příkaz, vedlejší výzva (PS2) značí, že bash očekává pokračování příkazu na dalším řádku, potvrzující výzva (PS0) se vypisuje po přijetí příkazu a před zahájením jeho vykonávání.
Escape sekvence je posloupnost ASCII znaků se zvláštním významem pro terminál, která začíná netisknutelným znakem „\e“. V minulosti se tyto sekvence zapisovaly ručně a děsily nezkušené uživatele; dnes je však většinou můžeme pohodlně generovat moderním příkazem „tput“ a jejich děsivou úlohu zaujaly sekvence znaků Unicode.
Paleta je (v této kapitole) pole barev, které daný terminál podporuje, indexované od nuly. Běžně se vyskytují pouze dvě palety: s 8 barvami a s 256 barvami, ačkoliv realizace konkrétních barev v těchto paletách se mohou v jednotlivých emulátorech mírně lišit (často jdou nastavit).
Poznámka: znění zaklínadel v této sekci je upraveno pro uvedení uvnitř dvojitých uvozovek. Při uvedení jiným způsobem (např. v jednoduchých uvozovkách nebo při načítání ze souboru) je tomu nutno uzpůsobit umístění zpětných lomítek.
Poznámka 1: Nastavení barevného zvýraznění příkazu „ls“ řídí proměnná prostředí
„LS_COLORS“, kterou bash nastavuje při spuštění interaktivní instance
z konfiguračního souboru „~/.dircolors“ (pokud existuje).
Změny tohoto souboru se tedy projeví teprve po jejich přepsání
do proměnné „LS_COLORS“.
Poznámka 2: nastavení v níže uvedených zaklínadlech je neprázdná posloupnost
číselných kódů (podle vzorníku) oddělených středníkem, např. „1;32“ pro tučné
modré písmo, „32“ pro modré písmo apod.
@nastavit šablonu hlavní výzvy/připojit k ní další text (analogicky platí i pro ostatní výzvy)#1
PS1="text"
PS1+="další text"
Důležitá poznámka: Aby mohl bash správně zformátovat hlavní a vedlejší výzvu (PS1 a PS2), potřebuje předem znát počet tisknutých znaků na každém řádku. Bohužel bash nerozumí escape sekvencím, proto mu musíte napovědět a tyto sekvence uzavřít do zvláštních závorek „\[“ a „\]“ (ve dvojitých uvozovkách se zadávají „\\[“ a „\\]“), které znamenají, že jejich obsah bash nemá při výpočtu šířky řádků vůbec zohledňovat. Tyto závorky se bohužel naopak nesmějí používat v proměnné PS0, tam by vypsaly škaredé paznaky na terminál. V ukázce a v některých zaklínadlech lze tento problém vyřešit tak, že místo přímého zadání příkazu tput použijete pomocnou funkci lkk_pstput.
Poznámka k emodži: Při použití emodži ve výzvách PS1 a PS2 je vhodné za ně zařadit znak „\u200b“ (mezera nulové šířky), protože většina z nich zabírá v emulátoru terminálu dva textové sloupce a bash by jinak chybně odhadl délku dané řádky výzvy. Pokud použijete emodži, která zabírá tři sloupce, použijte mezery nulové šířky dvě; pokud zabírá jen jeden sloupec, nevkládejte žádnou.
Výchozí nastavení výzev se nachází v souboru „~/.bashrc“. Umístěním svých definic na konec tohoto souboru můžete výchozí nastavení přepsat. Změna se projeví při dalším spuštění Bashe.
Konstrukci proměnné PS1 je vhodné pro přehlednost rozdělit do více řádek, kdy první řádka bude přiřazení a na dalších použijete operátor += k připojení hodnoty ke stávající hodnotě.
Tip: Před zkoušením nastavování barev a titulku terminálu si vypněte výzvu příkazem „PS1=""“. Výchozí výzva obsahuje escape sekvence, které by kolidovaly s těmi, které se snažíte zadat a rušily by jejich účinek.
Bash podporuje proměnnou „PROMPT_COMMAND“. Je-li nastavena, je vykonána jako příkaz těsně před vypsáním hlavní výzvy. Toho lze využít k nastavení proměnných, které pak ve výzvě použijeme. Proměnná PROMPT_COMMAND může obsahovat i více příkazů oddělených středníky. Podle manuálové stránky by příkazy uvedené v této proměnné neměly generovat žádný výstup na terminál! (Ale výstup do souboru je pravděpodobně v pořádku.)
1 Poznámka: Protože ve výchozím nastavení nastavuje titulek terminálu výzva PS1, před jakýmkoliv experimentováním ji musíte vypnout nebo změnit (např. příkazem „PS=""“), jinak vám vaše nové nastavení hned přepíše, takže se vám bude zdát, že nefunguje.
2 Funkce „lkk_bezp_set“ použije ze svých argumentů první podporované číslo barvy. Není-li žádné z uvedených čísel podporováno, žádná barva se nanastaví. Při volání doporučuji jako první uvést číslo pro paletu s 256 barvami a jako druhé číslo náhradní barvy z osmibarevné palety.
3 Na některých terminálech je realizován jako inverzní text, na jiných jako tučné písmo.
4 Používání blikajícího textu se výrazně nedoporučuje, protože je v různých terminálech málo a nejednotně podporován, má mnoho odpůrců a může uživateli způsobovat zdravotní potíže.
5 V interaktivním režimu program ukončíte klávesou „q“, další klávesové zkratky najdete v manuálové stránce. Rychlost je od 0 (nejrychlejší) po 9 (nejpomalejší).
6 Pro český text s háčky a čárky se bohužel dobře hodí jen písma „ascii9“, „smmono9“ a „standard“; čárky zvládají i některá další; písmena anglické abecedy zvládají všechna. Z filtrů mohu doporučit „gay“ a „border“, méně „metal“, „180“ a „flip“.
7 Řádky a sloupce jsou číslovány od nuly od levého horního rohu terminálu.
8 U druhé varianty (vyhodnotit při každém vypsání výzvy) musíte v příkazu odzvláštnit znaky ", \, $ a !, aby se do příslušné proměnné uložil přesně tak, jak má být vykonán.
9 Poznámka: Aby tento výraz fungoval, musíte do proměnné PROMPT_COMMAND (ideálně na začátek) přidat příkaz „navr_hodn=$?“, např. příkazem „PROMPT_COMMAND="navr_hodn=\$?;$PROMPT_COMMAND"“.
10 Pro popis vlastního formátu viz „man strftime“ nebo kapitolu „Datum, čas a kalendář“.
11 Poznámka: V případě, že nějaký příkaz spustíte na pozadí nebo ho přerušíte (Ctrl+Z), vypíše výzva dobu trvání po částech (vždy od potvrzení příkazu po následující zobrazení výzvy). Pro pokročilejší měření použijte příkaz „time“. Tyto příkazy navíc obsazují obsluhu signálu SIGUSR2, proto je nelze kombinovat s jinými příkazy, které by obsluhu tohoto signálu potřebovaly.
12 Viz poznámku pod čarou k „trvání posledního příkazu v sekundách“.
13 Tip: pokud to váš terminál podporuje, můžete použít i barvy v rozsahu 16 až 255. Odpovídající sekvence kódu jsou ovšem netriviální a je potřeba je vygenerovat níže uvedeným zaklínadlem z příkazu „tput“. Jejich použití také může způsobit potíže, pokud se přepnete na terminál, který tyto barvy nepodporuje.
14 Prázdný výstup znamená, že takovou sekvenci nelze vygenerovat.
15 Poznámka: toto nastavení má nižší prioritu než EXEC, proto spustitelné soubory s více pevnými odkazy nebudou tímto nastavením zvýrazněny.
16 Ve výchozím konfiguračním souboru musíte toto nastavení nejprve odkomentovat. Pozor, po odkomentování překryje nastavení MULTIHARDLINK!