9. díl - Linuxový terminál (Bash) - Standardní vstup/výstup a expanze

Linux a UNIX Základy Linuxový terminál (Bash) - Standardní vstup/výstup a expanze

V minulém dílu našeho seriálu o Linuxu jsme pokračovali v prohlídce terminálu. Naučili jsme se pracovat s uživatelskými právy a spravovat procesy. V dnešním dílu se zaměříme na standardní vstup/výstup a vysvětlíme si pojem expanze.

Standardní vstup a výstup

V Linuxu existují pojmy "standardní výstup" a "standardní vstup". Jedná se o základní datové proudy, se kterými pracuje většina linuxových programů. Čtou z nich data nebo do nich data naopak zapisují. Ve výchozím nastavení je standardní výstup připojený na konzoli a standardní vstup na klávesnici. Takto jsme komunikovali např. s programem ls, který vypsal obsah složky na standardní výstup, tedy do konzole.

Výpis souborů a složek v terminálu Linuxu

Přesměrování výstupu

Standardní výstup můžeme pro daný program přesměrovat a to pomocí operátoru >, případně >>. Zkusme si to:

Přesměrování výstupu v Bash v Linuxu

Do konzole se nyní nevypsalo nic a ve složce se naopak objevil soubor vypis.txt, který se pro program choval jako standardní výstup a proto je v něm výpis složek. Soubor můžeme otevřít např. v geditu nebo v nano.

Přesměrování výstupu v Bash v Linuxu

Pokud použijeme operátor >, soubor se vždy přepíše. S operátorem >> se připisuje na konec souboru (append) a jeho obsah se tedy nemaže.

Přesměrování vstupu

Podobně, jako výstup, můžeme přesměrovat i vstup. Nemělo by vás překvapit, že toho docílíme pomocí znaku <. Možná vás napadá k čemu je to dobré, když uživatel téměř vždy zadává klávesnicí. Jako vstup můžeme určitě použít textový soubor nebo dokonce výstup nějakého jiného programu (viz dále).

Jako ukázka nám poslouží naprosto jednoduchý výpis hlavičky souboru. Hlavičkou je myšleno prvních 10 řádků a vypíšeme ji příkazem head. Jako vstup ji nasměrujeme náš soubor z předešlé ukázky.

Přesměrování vstupu v Bash v Linuxu

Výstup můžeme klidně opět přesměrovat do dalšího souboru.

Přesměrování vstupu v Bash v Linuxu

Roury (pipelines)

Když lze přesměrovat vstup i výstup nějakého příkazu, neměl by být problém propojit 2 příkazy tak, aby druhý zpracovával výstup toho prvního. Příkazy propojíme pomocí hezky expresivně nazvané trubky, kterou zapíšeme svislítkem. Můžete se setkat i s označením roura nebo "pajpa" od anglického pipe.

Na příkladu si vypišme obsah složky do prohlížeče textových souborů less. Výhodou je, že můžeme výpisem jednoduše stránkovat.

Roury v Bashi v Linuxu
Propojení less pomocí roury s příkazem ls v Linuxu

Trubek můžeme použít hned několik, udělejme si stejný příklad s tím rozdílem, že výpis z ls pošleme filtru head, který ořízne jen prvních 10 řádků a ty pošleme druhou trubkou less.

Roury v Bashi v Linuxu
Propojení less pomocí roury s příkazem ls v Linuxu

Filtry

Mnoho příkazů (nebo obecně programů) přijímá data na standardním vstupu, tato data nějak zpracuje a výsledek odešle na výstup. Takovým příkazům se někdy říká filtry a se znalostí přesměrování vstupů/výstupů a trubek jsou velmi užitečné. Zmiňme si alespoň některé z nich.

cat Cat je zkratka z concatenate, tedy spojit. Jedná se o program, který načte jeden nebo více souborů a pošle je na standardní výstup. Můžeme pomocí něj soubory i vytvářet. Soubory předáme jednoduše v parametrech, pokud jich předáme více, spojí se do jednoho delšího textu.
cut Cut umožňuje již podle názvu nařezat vstupní text a to např. podle bajtů, znaků nebo sloupců.
fmt Zformátuje daný text, aby byl lidsky lépe čitelný. Často se používá např. pro zalomení odstavců na určitou délku řádku.
grep Vypíše řádky ze vstupu, které odpovídají zadanému formátu. Můžeme zde použít i regulární výrazy.
head Vypíše prvních 10 řádků ze vstupu.
pr Připraví text pro tisk a to zejména tak, že ho rozdělí na jednotlivé stránky.
sort Setřídí řádky textu na vstupu podle abecedy a pošle je na výstup.
uniq Pokud filtru předáme setříděný soubor, odstraní z něj duplicitní řádky.
tail Vypíše posledních 10 řádků ze vstupu.
tr Tr je odvozeno z translate a umožňuje nahradit znaky ve vstupním textu. Můžeme nahrazovat určitá slova nebo třeba vše převést na velká písmena.
awk Implementace jazyka AWK pro zpracovávání textových souborů.
sed Pokročilejší verze příkazu tr.

Expanze

Již víme, že v shellových příkazech můžeme používat speciální znaky. Zatím jsme se takto setkali např. s "*" nebo s "?". Než je takový příkaz vykonán, je shellem nejprve zpracován a proběhne tzv. expanze. Různé zkrácené zápisy a značky jsou v tu chvíli převedeny na jejich výsledek.

Na expanzi se můžeme velmi jednoduše podívat a to pomocí příkazu echo. Ten možná znáte z Windows a vykonává jen jednu jednoduchou úlohu - vypíše text předaný v parametru do standardního výstupu. Nejprve si ho vyzkoušejme:

Příkaz echo v Bashi v Linuxu

Nyní si vypišme, jak shell vidí např. příkaz cp -r * slozka:

Expanze hvězdičky v Bashi

Vidíme, že se hvězdička přeložila (expandovala) na názvy všech souborů a složek, které jsou zde umístěné. Samozřejmě si můžete vyzkoušet i další kombinace, např. echo *.txt, což se expanduje jen na textové soubory v aktuální složce.

Tilda

Tilda se přeloží na domovskou složku aktuálního nebo zadaného uživatele:

Expanze tildy v Bashi v Linuxu

Složené závorky

Pokud ve výrazu použijeme složené závorky, vygeneruje se nám množina textových řetězců tak, aby se vyčerpaly všechny možnosti, které v závorkách uvedeme. Obrázek řekne více, než tisíc slov.

Expanze složených závorek v Bashi v Linuxu

Vidíme, že nám Bash vygeneroval množinu řetězců, kde každý začíná na slozka a potom obsahuje jeden ze znaků v závorkách, které jsme oddělili čárkou.

Uvnitř závorek můžeme používat i patterny jako 1..9, A-F nebo dokonce z-a. Výsledek samozřejmě nemusíme echovat, ale můžeme si nechat složky vytvořit:

Expanze složených závorek v Bashi v Linuxu

Aritmetické výrazy

Bash za nás vyhodnotí i jednoduché matematické výrazy. Bohužel umí pracovat jen s celými čísly. Výraz vložíme do notace $() a uvnitř ještě do jedné závorky.

Aritmetické výpočty v Bashi v Linuxu

Proměnné

Bash za nás expanduje spoustu proměnných. Ty se píší velkými písmeny a začínají na znak dolaru. Seznam všech si můžeme vypsat pomocí příkazu printenv. Se znalostí trubek si je můžeme nechat seřadit podle abecedy a otevřít v lessu:

Proměnné v Bashi v Linuxu
Proměnné v Bashi v Linuxu

Určitě jste si všimli proměnných USER a HOME. Vypišme si je:

Výpis proměnných USER a HOME v Bashi v Linuxu

Příkazy

Do samotného příkazu můžeme vložit i výstup jiného příkazu. Neplést s "pajpou", kde jsme nasměrovali jeden program do druhého. Zde načítáme výstup programu a vkládáme ho jako část příkazu, který shell později spustí.

Expanze příkazu v Linuxu

Místo syntaxe $() lze alternativně použít i zpětné uvozovky.

Uvozovky a escapování

Bash bere bílé znaky jako oddělovače příkazů a jejich parametrů. Je jedno kolik mezer nebo tabulátorů za sebe napíšeme, vždy je vyhodnotí jako jedno oddělení. Použít mezeru jako součást příkazu by byl problém, stejně jako použít nějaké z dalších speciálních znaků, jako jsou $ nebo zpětné uvozovky (`).

Znak dolaru v Bashi v Linuxu

Máme celkem 3 možnosti jak se s takovou situací vypořádat.

Dvojité uvozovky

Pokud vložíme část textu příkazu do dvojitých uvozovek, bude Bash interpretovat $, \ a `. Ostatních věcí jako ~, mezer a podobně si nevšímá. Nejčastější využití dvojitých uvozovek je zadání názvu souboru nebo složky, která má v názvu mezeru. Mimochodem, takové složky pokud možno nevytvářejte, lidé ve vašem okolí vám poděkují :)

Uvozovky v Bashi v Linuxu

Na obrázku výše vidíme i co se stane bez uvozovek. Bash vyhodnotí slozka jako druhý parametr příkazu ls.

Můžeme si zkusit zapsat do dvojitých uvozovek např. nějakou konstantu, abychom viděli, že se opravdu interpretuje:

Uvozovky v Bashi v Linuxu
Jednoduché uvozovky (apostrofy)

Výraz v jednoduchých uvozovkách se do shellu vloží přesně tak, jak je zapsaný. Expanze se nevyhodnotí a mezery se nesloučí:

Využití apostrofů v Bashi v Linuxu
Escapování

Jestli vás nepadlo co dělat, když potřebujeme někam zapsat uvozovky, tak v této situaci použijeme tzv. escapování. Speciální znaky můžeme totiž předsadit zpětným lomítkem a Bash si jich poté nevšímá. Zbývá vyřešit již jen situaci, kdy potřebujeme zapsat zpětné lomítko. V tu chvíli ho odescapujeme a zapíšeme jednoduše 2 za sebou.

Escapování speciálních znaků v Bashi v Linuxu

Kromě dolaru, různých uvozovek a mezer můžeme pomocí escapování zapsat i několik speciálních znaků:

\n Zalomení řádku. U textových souborů z Windows bude znak následován ještě znakem \r.
\t Tabulátor
\\ Zpětné lomítko
\f Form feed přinutí tiskárnu, aby vysunula danou stránku
\a Alert terminálu (pípnutí)

 

  Aktivity (2)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (11 hlasů) :
55555


 



 

 

Komentáře

Avatar
Mattew
Člen
Avatar
Mattew:

Čau, jen pro upřesnění v části článku - Roury je část textu "který ořízne jen posledních 10 řádků a ty pošleme druhou trubkou less." má tam bejt místo posledních 10 - prvních 10? Já jen jestli to chápu správně.. Jinak díky za návody, do začátku super ;)

 
Odpovědět 29.5.2015 16:04
Avatar
Filip Šohajek
Redaktor
Avatar
Odpovídá na Mattew
Filip Šohajek:

Ano, v článku je chyba. Má tam být prvních 10.

 
Odpovědět 29.5.2015 16:13
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Mattew
David Čápka:

Díky, opravil jsem to :)

Odpovědět 29.5.2015 16:17
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.