9. diel - Linuxový terminál (Bash) - Štandardný vstup / výstup a expanzia
V minulom dieli nášho seriálu o Linuxe sme pokračovali v prehliadke terminálu. Naučili sme sa pracovať s užívateľskými právami a spravovať procesy. V dnešnom dieli sa zameriame na štandardný vstup / výstup a vysvetlíme si pojem expanzie.
Štandardný vstup a výstup
V Linuxe existujú pojmy "štandardný výstup" a "štandardný vstup". Ide o základné dátové prúdy, s ktorými pracuje väčšina linuxových programov. Čítajú z nich dáta alebo do nich dáta naopak zapisujú. Štandardne je štandardný výstup pripojený na konzolu a štandardný vstup na klávesnici. Takto sme komunikovali napr. S programom ls, ktorý vypísal obsah zložky na štandardný výstup, teda do konzoly.
Presmerovanie výstupu
Štandardný výstup môžeme pre daný program presmerovať a to pomocou operátora>, prípadne >>. Skúsme si to:
Do konzoly sa teraz nevypísala nič a v priečinku sa naopak objavil súbor vypis.txt, ktorý sa pre program správal ako štandardný výstup a preto je v ňom výpis zložiek. Súbor môžeme otvoriť napr. V gedit alebo v nano.
Ak použijeme operátor>, súbor sa vždy prepíše. S operátorom >> sa pripisuje na koniec súboru (append) a jeho obsah sa teda nemaže.
Presmerovanie vstupu
Podobne, ako výstup, môžeme presmerovať aj vstup. Nemalo by vás prekvapiť, že toho docielime pomocou znaku <. Možno vás napadá k čomu je to dobré, keď užívateľ takmer vždy zadáva klávesnicou. Ako vstup môžeme určite použiť textový súbor alebo dokonca výstup nejakého iného programu (viď ďalej).
Ako ukážka nám poslúži úplne jednoduchý výpis hlavičky súboru. Hlavičkou je myslené prvých 10 riadkov a vypíšeme ju príkazom head. Ako vstup ju nasmerujeme náš súbor z predošlej ukážky.
Výstup môžeme pokojne opäť presmerovať do ďalšieho súboru.
Rúry (pipelines)
Keď dá presmerovať vstup aj výstup nejakého príkazu, nemal by byť problém prepojiť 2 príkazy tak, aby druhý spracovával výstup toho prvého. Príkazy prepojíme pomocou pekne expresívne nazvanej rúrky, ktorú zapíšeme zvislou čiarou. Môžete sa stretnúť aj s označením rúra alebo "pajpa" od anglického pipe.
Na príklade si výpisy obsah zložky do prehliadača textových súborov less. Výhodou je, že môžeme výpisom jednoducho stránkovať.
Rúrok môžeme použiť hneď niekoľko, urobme si rovnaký príklad s tým rozdielom, že výpis z ls pošleme filtra head, ktorý oreže len prvých 10 riadkov a tie pošleme druhú trubkou less.
Filtre
Mnoho príkazov (alebo všeobecne programov) prijíma dáta na štandardnom vstupe, tieto dáta nejako spracuje a výsledok odošle na výstup. Takým príkazom sa niekedy hovorí filtre a so znalosťou presmerovanie vstupov / výstupov a trubiek sú veľmi užitočné. Spomeňme si aspoň niektoré z nich.
cat | Cat je skratka z CONCATENATE, teda spojiť. Ide o program, ktorý načíta jeden alebo viac súborov a pošle ich na štandardný výstup. Môžeme pomocou neho súbory aj vytvárať. Súbory odovzdáme jednoducho v parametroch, pokiaľ ich odovzdáme viac, spoja sa do jedného dlhšieho textu. |
cut | Cut umožňuje už podľa názvu narezať vstupný text a to napr. Podľa bajtov, znakov alebo stĺpcov. |
fmt | Sformátuje daný text, aby bol ľudsky lepšie čitateľný. Často sa používa napr. Pre zalomenie odsekov na určitú dĺžku riadku. |
grep | Vypíše riadky zo vstupu, ktoré zodpovedajú zadanému formátu. Môžeme tu použiť aj regulárne výrazy. |
head | Vypíše prvých 10 riadkov zo vstupu. |
pr | Pripraví text pre tlač a to najmä tak, že ho rozdelí na jednotlivé stránky. |
sort | Zotriedi riadky textu na vstupe podľa abecedy a pošle ich na výstup. |
UNIQ | Ak filtra odovzdáme zotriedený súbor, odstráni z neho duplicitné riadky. |
tail | Vypíše posledných 10 riadkov zo vstupu. |
tr | Tr je odvodené z translate a umožňuje nahradiť znaky vo vstupnom texte. Môžeme nahrádzať určité slová alebo treba všetko previesť na veľké písmená. |
awk | Implementácia jazyka AWK pre spracovávanie textových súborov. |
sed | Pokročilejšie verzie príkazu tr. |
Už vieme, že v shell príkazoch môžeme používať špeciálne znaky. Zatiaľ sme sa takto stretli napr. S "*" alebo s "?". Než je taký príkaz vykonaný, je shell a najprv spracovaný a prebehne tzv. Expanzie. Rôzne skrátené zápisy a značky sú v tú chvíľu prevedené na ich výsledok.
Na expanziu sa môžeme veľmi jednoducho pozrieť a to pomocou príkazu echo. Ten možno poznáte z Windows a vykonáva len jednu jednoduchú úlohu - vypíše text odovzdaný v parametri do štandardného výstupu. Najprv si ho vyskúšajme:
Teraz si výpisy, ako shell vidí napr. Príkaz cp -r * zlozka:
Vidíme, že sa hviezdička preložila (expandovala) na názvy všetkých súborov a priečinkov, ktoré sú tu umiestnené. Samozrejme si môžete vyskúšať aj ďalšie kombinácie, napr. Echo * .txt, čo sa expanduje len na textové súbory v aktuálnej zložke.
Tilda
Tilda sa preloží na domovskú zložku aktuálneho alebo zadaného užívateľa:
Zložené zátvorky
Pokiaľ vo výraze použijeme zložené zátvorky, vygeneruje sa nám množina textových reťazcov tak, aby sa vyčerpali všetky možnosti, ktoré v zátvorkách uvedieme. Obrázok povie viac, ako tisíc slov.
Vidíme, že nám Bash vygeneroval množinu reťazcov, kde každý začína na priecinok a potom obsahuje jeden zo znakov v zátvorkách, ktoré sme oddelili čiarkou.
Vnútri zátvoriek môžeme používať aj patterny ako 1..9, AF alebo dokonca za. Výsledok samozrejme nemusíme echovat, ale môžeme si nechať zložky vytvoriť:
Aritmetické výrazy
Bash za nás vyhodnotí aj jednoduché matematické výrazy. Bohužiaľ vie pracovať len s celými číslami. Výraz vložíme do notácie $ () a vo vnútri ešte do jednej zátvorky.
Premenné
Bash za nás expanduje veľa premenných. Tie sa píšu veľkými písmenami a začínajú na znak dolára. Zoznam všetkých si môžeme vypísať pomocou príkazu printenv. So znalosťou trubiek si ich môžeme nechať usporiadať podľa abecedy a otvoriť v Less:
Určite ste si všimli premenných USER a HOME. Vypíšme si ich:
Príkazy
Do samotného príkazu môžeme vložiť aj výstup iného príkazu. Nepliesť s "pajpou", kde sme nasmerovali jeden program do druhého. Tu načítame výstup programu a vkladáme ho ako časť príkazu, ktorý shell neskôr spustí.
Namiesto syntaxe $ () možno alternatívne použiť aj spätné úvodzovky.
Úvodzovky alebo uvádzacích
Bash berie biele znaky ako oddeľovače príkazov a ich parametrov. Je jedno koľko medzier alebo tabulátorov za seba napíšeme, vždy je vyhodnotí ako jedno oddelenie. Použiť medzeru ako súčasť príkazu by bol problém, rovnako ako použiť nejaké z ďalších špeciálnych znakov, ako sú $ alebo spätné úvodzovky ( `).
Máme celkom 3 možnosti ako sa s takouto situáciou vysporiadať.
Dvojité úvodzovky
Ak vložíme časť textu príkazu do dvojitých úvodzoviek, bude Bash interpretovať $, \ a `. Ostatných vecí ako ~, medzier a podobne si nevšíma. Najčastejšie využitie dvojitých úvodzoviek je zadanie názvu súboru alebo zložky, ktorá má v názve medzeru. Mimochodom, také zložky pokiaľ možno nevytvárajte, ľudia vo vašom okolí vám poďakujú
Na obrázku vyššie vidíme aj čo sa stane bez úvodzoviek. Bash vyhodnotí zlozka ako druhý parameter príkazu ls.
Môžeme si skúsiť zapísať do dvojitých úvodzoviek napr. Nejakú konštantu, aby sme videli, že sa naozaj interpretuje:
Jednoduché úvodzovky (apostrofy)
Výraz v jednoduchých úvodzovkách sa do shellu vloží presne tak, ako je zapísaný. Expanzia sa nevyhodnotí a medzery sa nesloučí:
Uvádzacích
Ak vás nepadlo čo robiť, keď potrebujeme niekam zapísať úvodzovky, tak v tejto situácii použijeme tzv. Uvádzacích. Špeciálne znaky môžeme totiž predsadiť spätným lomítkom a Bash si ich potom nevšíma. Zostáva vyriešiť už len situáciu, keď potrebujeme zapísať spätné lomítko. V tej chvíli ho odescapujeme a zapíšeme jednoducho 2 za sebou.
Okrem dolára, rôznych úvodzoviek a medzier môžeme pomocou uvádzacích zapísať aj niekoľko špeciálnych znakov:
\ n | Zalomenie riadku. U textových súborov z Windows bude znak nasledovaný ešte znakom \ r. |
\ t | tabulátor |
\\ | spätné lomítko |
\ f | Form feed prinúti tlačiareň, aby vysunula danú stránku |
\ a | Alert terminálu (pípnutie) |
V budúcej lekcii, Linuxový terminál (Bash) - Správa užívateľov , sa naučíme pracovať s najdôležitejšími príkazmi pre správu užívateľov v Linuxe.