Terminál, 4. kapitola
Minule jsme tohle téma již nakousli, já se k němu vrátím a trochu ho rozšíříme o teorii, abychom věděli co přesně můžeme udělat a jak nám to může posloužit. Dnes pochopíme (alespoň doufám), proč je „|“ tak mocná zbraň v terminálu.
Přesměrování výstupu a vstupu
Rozlišujeme tři druhy „komunikačních kanálů“. 1) stdin – (standard input), jedná se o komunikační kanál, který obvykle ovlivňujeme psaním na klávesnici… Alternativní způsob je použít „<“, kdy dojde ke vstupu ze souboru. Co by to byla za návod, kdybych neuvedl příklad použití. Představte si příklad s příkazem tac, ten jsem vám sice ještě nepředstavil, ale slouží k vypsání textu v obráceném pořadí řádků (zkuste si to, napište tac, pak pár řádků a až budete hotovi, tak to dejte Ctrl + D), teď k tomu příkladu. Vytvoříme si soubor, vložíme do něj nějaký náhodný text (na pár řádek, ať to má smysl). Soubor vypíšeme pomocí cat v terminálu, dále koukejte na příklad.
a
b
…
y
z
user@computer:$ tac < text > txet
user@computer:$ cat txet
z
y
…
b
a
2) stdout – (standard output), jedná se o kanál běžných odpovědí programů. Výstup takto můžete přesměrovat do souboru. Dva způsoby, první „>“ zapíše do souboru a přepíše předchozí, kdežto „>>“ zapisuje na konec souboru. 3) stderr – (standard error) Jedná se o komunikační kanál pro chybová hlášení, ukážu příklad, proč je to pro nás důležité.
ls: nelze přistoupit k *.ocas: Adresář nebo soubor neexistuje
Chceme vypsat všechny soubory s koncovkou „.ocas“, žádné to nenašlo a pokud by ls vypisovala chybová hlášení, tak ani nevíme o tom, že se taková chyba stala. Každý kanál má své číslo, stdint – 0, stdout – 1, stderr – 2.
Pipe, „|“ jedná se o znak, která má dec. číslo v ASCII 124 a já ho na české klávesnici píšu jako Alt gr + W. Teď něco k funkčnosti, | přesměrovává výstup z jednoho příkazu do dalšího jako vstup. Jedná se tedy o možnost řetězit příkazy za sebe. Zde příklad s vypsáním seznamu souborů pozpátku.
zvire
tygr
text
soubor
analfabet
Dovolím si krátkou vsuvku, rozuměj jako humor. Pokud nechápete, tak si to zkuste.
<PokusOVtip> ondrej@ondrej-IdeaPadY570 ~/serial $ ls | tac | tac </PokusOVtip>
Přesměrování STDERR
Pokud by jste měli zájem tvořit si nějaké log soubory s chybami, tak je třeba přesměrovat chybové výstupy. Zde využijeme možnosti označit si jednotlivé komunikační kanály čísly.
user@computer:$ cat log.txt
ls: nelze přistoupit k *.prase: Adresář nebo soubor neexistuje
V případě, že chceme zaznamenávat jak úspěchy a neúspěchy do jednoho souboru, potom je třeba použít takovouto syntaxi
Jedná se vlastně o běžný zápis, ovšem s tím rozdílem, že STDERR ještě přeposíláme na výstup 1. Mimochodem znak „&“ na české klávesnici napíšete jako Alt gr + C. V případě přesměrování rourou se to píše před ní, viz příklad.
Návrat k výpisům
Dovolím si ještě se trochu vrátit k výpisům a doplnit to, na co jsem zapomněl, jen stručně o tail a head. Oboje má podobné přepínače, podívejte se do nápovědy, či manuály, já to rovnou uvedu na příkladu.
1
2
3
4
user@computer:$ head -n 2 log.txt
1
2
user@computer:$ tail -n 2 log.txt
3
4
Takže přepínač n s parametrem 2 znamená počet, u head počet prvních řádků u tail počet posledních řádků, obdobně funguje i přepínač -c ale s počtem bajtů (zjednodušeně počtem znaků).
Co bude příště?
Příště se vyhrneme na nějaké tipy při psaní v terminálu, na kopírování textu, procházení historie, atd. A pravděpodobně nakousneme téma, které je velmi mocné a tím je superuživatel, známý také jako root. Chci se také dostat na grep, ale to se teprve uvidí…
Další díl