Pokročilé funkce

Linuxový shell

Cvičení

Soubory a souborový systém

SSŠVT

Emulace shellu v Linuxu

Pokročilé funkce

Tato část projektu LinSh přidá k minimální funkcionalitě a rozšířenému chování ještě další vlastnosti, které standardní řádkové shelly vždy nabízejí:


Pajpování

Některé příkazy shellu potřebují jako vstup nějaký textový soubor, obecně textový stream. Jiné příkazy posílají svůj výstup na konzoli (na terminál), a to opět v textové podobě, tedy zase jako nějaký textový stream (proud znaků s oddělovači řádků).

Pajpování je technika, při které "propojíme" výstup (output stream) jednoho příkazu se vstupem (input stream) druhého příkazu. Pokud má druhý příkaz i textový výstup, je možné ho dále připojit na třetí příkaz, který očekává textový vstup. A tak dále.

Na příkazové řádce se piping vyznačí pomocí znaku "svislé lomeno" (|) (svislítko), kterému podle jeho častého účelu programátoři přezdívají "pipe" (pajpa).

Příklad příkazu s pajpou:

grep "sr" StreamReaderExample.csx | wc -l
        

Popis chování:

Příkaz grep vezme soubor StreamReaderExample.csx a hledá v něm řádky obsahující řetězec "sr". Každý řádek, ve kterém se zadaný řetězec najde, chce grep vypsat na konzoli.

Každý příkaz v linuxovém shellu má přiřazen tzv. standardní vstup a standardní výstup. Standardním vstupem je pro grep soubor, který se má prohledat, standardním výstupem je pak konzole (terminál). Příkaz wc to má obdobné.

Tím, že zřetězíme příkazy grep a wc na jediné příkazové řádce pomocí pajpy, změníme 2 věci:

  1. Přesměrujeme standardní výstup příkazu grep do speciálního streamu, kterému se někdy rovněž říká pipe (posíláme jeho výstup do "roury").
  2. Zároveň s tím přesměrujeme standardní vstup příkazu wc rovněž na pipe (rouru), tj. říkáme mu, aby vstupní stream, který má zpracovat, nebral ze souboru, ale z té roury.

Jinými slovy – to, co vrací grep, se jakoby dočasně dostane do nepojmenovaného souboru, který jako svůj vstupní parametr potom dostane wc. Příkaz wc počítá (se switchem -l) řádky vstupního souboru. Výsledkem takto zřetězeného příkazu grep s příkazem wc bude tedy pouze počet řádků souboru StreamReaderExample.csx, které obsahují řetězec "sr".

Jiný příklad s pajpou:

ls -la /c/Windows | less
        

Představme si, že na našem disku je adresář C:\Windows, který obsahuje mnoho souborů a podadresářů. Výpis, který bychom dostali z příkazu "ls -la /c/Windows", by byl strašně dlouhý a "utekl" by nám z konzole, protože ta má pouze omezený počet řádků (např. 30).

Tím, že pomocí pajpy zřetězíme výstup příkazu ls se vstupem příkazu less, docílíme toho, že si celý obsah adresáře C:\Windows můžeme v klidu prohlédnout, aniž by nám (kvůli tomu, jak je dlouhý) nekontrolovaně "odjel" z obrazovky.


Přesměrování výstupu

Častý scénář v řádkovém shellu je, že výstup nějakého příkazu je velmi rozsáhlý (viz výše – jeden z příkladů "pajpování") a nás celý výstup momentálně (v okamžiku spuštění příkazu) nezajímá. Chceme si ho třeba prohlédnout později, nebo ho poslat svému nadřízenému emailem.

V takovém případě se hodí přesměrování výstupu příkazu do souboru. Na přesměrování se používá znak "většítko" (>), případně dvě většítka za sebou (>>), za které uvedeme název souboru (případně i cestu k němu), kam se má výstup posílat.

To, zda použijeme jednoduché většítko, nebo to zdvojené, závisí na tom, zda soubor, kam výstup shellového příkazu přesměrováváme, již na disku existuje, nebo neexistuje, a v případě, že existuje, tak zda chceme jeho původní obsah zachovat (a nový pouze přidat na konec, za ten původní), anebo chceme původní obsah souboru přepsat obsahem novým.

Jednoduché většítko způsobí přepsání původního obsahu, zdvojené (pokud soubor existuje) pak zachování jeho obsahu. Zdvojená většítka se často používají při logování: Napíšeme nějaký větší skript a výstupy jeho příkazů "přidáváme" do souboru, který slouží jako "log" (záznam) celé komplexní operace, kterou skript provádí.

Příklad přesměrování výstupu do souboru:

grep "sr" StreamReaderExample.csx > lines_with_sr.txt
        

Popis chování:

Řádky vstupního souboru StreamReaderExample.csx, které obsahují řetězec "sr", se zapíší do nového souboru lines_with_sr.txt (v aktuálním adresáři). Pokud soubor s tímto jménem na disku již předtím existoval, jeho obsah se výstupem příkazu grep přemaže, protože jsme použili jednoduché většítko (>), nikoliv zdvojené (>>).