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í:
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:
grep
do speciálního streamu, kterému se někdy rovněž říká pipe (posíláme jeho výstup do "roury").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.
Č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é (>>).