Obsah

Základy příkazové řádky

Filozofie UNIXu

Filozofií UNIXu je (zkráceně) následující rčení:

Pište takové programy, které dělají jen jednu věc a dělají ji dobře.

Nezkrácená verze zmiňuje i to, že by měly spolupracovat a používat tzv. „standardní proudy“. To zjednodušeně znamená, že se chovají v podstatě stejně, ať už čtou ze souboru, nebo od uživatele. Výhodou tohoto přístupu je, že se všechny jednoduché programy dají skládat dohromady a i neprogramátor díky nim dokáže zpracovat velké množství dat či zjednodušit (nebo dokonce automatizovat) nějakou činnost.

Seznámení se základními pojmy

Co je to "příkazová řádka"

Jak již název naznačuje, jedná se o řádek určený k zadávání příkazů. To je všechno, o nic víc nejde. Tedy, velice zjednodušeně. Když se dostaneme dál, tak zjistíme, že příkazová řádka je hodně rozdílná věc podle toho, v jakém operačním systému pracujeme. Někdy se může různě chovat a nebo jinak vypadat.

My se budeme věnovat příkazové řádce tak, jak se chová a vypadá v aplikaci Terminál na Linuxu. Už je vám to povědomé? Jestli ne, tak si klidně terminál pusťte (klávesou s logem se dostaneme do Aktivit a tady už stačí začít psát slovo terminál. Ještě ani nebudete mít napsané ter a už bude vidět jeho ikona. Nejpozději u term už bude i označená a bude stačit zmáčknout Enter).

Příkazová řádka, nebo anglicky command line, je užitečný nástroj. Není třeba se obávat, že je:

Jaký je rozdíl mezi "příkazovou řádkou" a "CLI"

I když programy v počítači někdy fungují samy od sebe, velice často s vámi (uživatelem) komunikují. Ať už je to zobrazení obrázku, dialogového okna a nebo nějakého textu, reakce na kliknutí nebo posun myši či zmáčknutí klávesy na klávesnici. Používá se pro to pojem rozhraní (anglicky interface). Rozhraní mohou být různá, a tak často uslyšíme toto slovo ve spojení s nějakým upřesňujícím pojmem.

Nejčastějšími pojmy (anglické pojmy se zkratkami v závorkách) jsou:

Příkazová řádka je tedy něco, kam můžeme psát příkazy a kde spouštět programy. Prostředí, ve kterém pracujeme, je CLI. Pokud má nějaký projekt CLI nástroj, znamená to, že půjde ovládat v příkazové řádce.

Výhody

To, že se některý program ovládá z příkazové řádky, neznamená, že je hned složitější, špatný nebo toho méně umí. Většinou je to právě naopak. Zkrátka je to jen jiné rozhraní, jak komunikovat s programem.

Hlavní výhody příkazové řádky jsou (tedy hlavně oproti GUI):

Příkazová řádka je také program

Příkazová řádka, kterou používáte, je také jen program který v běží v Terminálu. Pokud máte puštěnou Fedoru a nic jste neměnili, tak příkazová řádka, kterou máte puštěnou, je program bash. Existuje spousta dalších, ale až na výjimky jsou základy práce s nimi téměř stejné. Tomuto typu programu se říká shell.

Pro zopakování pojmů:

Důležité:

Umístění programů v systému

Pokud napíšeme příkaz do příkazové řádky a chceme jej spustit, tak se děje několik věcí. Nejprve shell zjistí, jestli se jedná o cestu k nějakému souboru (ať už relativní, nebo absolutní) a pokud ano, tak se ho pokusí najít a spustit. Pokud to cesta není, tak zjistí, jestli to není název nějakého zabudovaného příkazu. Když ano, tak ho spustí a když ne, tak hledá program s tímto názvem v seznamu adresářů uložených v proměnné $PATH.

Proměnná PATH se k tomuto účelu používá na většině operačních systémů. Je ale nutno dodat, že podstatným rozdílem oproti některým jiným systémům je, že se program se specifikovaným názvem nehledá v aktuálním adresáři, ale pouze v těch specifikovaných ve zmíněné proměnné. To by mohlo způsobit nejen nechtěné problémy v některých situacích, ale také bezpečnostní riziko.

Prompt

To, co uvidíte, když spustíte nový terminál, může vypadat třeba takto (toto je příklad z live DVD Fedory 28, nelekněte se, pokud váš vypadá jinak):

[liveuser@localhost-live ~]$ █

Tomu se říká prompt (z angličtiny pobídka) a vyzývá nás k tomu, abychom napsali nějaký příkaz, který se píše na ten řádek. Od toho je to „příkazový řádek“. Jednotlivé jeho části se můžou (a budou) časem měnit. To, co můžeme vyčíst z tohoto příkladu, je:

|---------- prompt ---------|
uživatel  název hostitele
  |        |           cesta
  V        V             V   |----------- příkaz -----------|
[liveuser@localhost-live ~]$ echo -n 'Ahoj     vsichni' kolem
Ahoj     vsichni kolem     ^  ^   ^^ |-------+--------|  ^
|---------+----------|     |  |   |`---------+-----------+
          |                |  |  přepínač                |
          |                | název příkazu             argumenty
       výstup             uživatel není přepnutý na administrátora

Zobrazení nápovědy k příkazům

Pokud chcete o nějakém příkazu zjistit více, např. jaké podporuje a přijímá argumenty, co vlastně dělá atd., tak máte několik možností. Většina programů bude mít alespoň jedno z následujících:

Zkuste si zjistit informace o různých příkazech za pomoci různých metod. Pokud se vám zobrazí prohlížení v terminálu (nebude čekat na zadávání příkazu), tak pomocí šipek a PageUp a PageDown se můžete pohybovat. Prohlížení ukončíte klávesou q.

Používání příkazové řádky

Všechno budeme zkoušet v programu *Terminál*. Doporučuji okno maximalizovat abychom měli hodně prostoru – nebudeme potřebovat nic jiného.

Zadávání příkazů

Příkazy, které budeme zadávat, mohou být jak zabudované příkazy příkazového řádku, tak i programy nainstalované v operačním systému.

Nejprve vyzkoušíme příkaz echo. Po napsání příkazu ho potvrdíme stisknutím tlačítka Enter. Kurzor odskočil o dva řádky a vypsal se nám znovu prompt. To, že nás znovu pobízí k dalšímu příkazu, je známka toho, že náš předchozí příkaz skončil. Proč se ale vypsal jen prázdný řádek? Zkusíme tedy napsat třeba:

$ echo Ahoj

Po zmáčknutí klávesy Enter se nám vypsalo Ahoj:

[liveuser@localhost-live ~]$ echo Ahoj
Ahoj
[liveuser@localhost-live ~]$ █

Příkaz echo tedy vypisuje to, co za něj napíšeme, a pak skočí na další řádek. V tomto případě je „Ahoj“ za příkazem stále jeho součástí, říká se jí argument. „Ahoj“ na samostatném řádku je výstup toho příkazu.

Co když výstup příkazu neskočí na další řádek? To si můžeme vyzkoušet. Takto by to mohlo vypadat před a po:

[liveuser@localhost-live ~]$ echo -n Ahoj
Ahoj[liveuser@localhost-live ~]$ █

Rozdíl tohoto příkazu oproti předchozímu je přidání -n mezi název příkazu a jeho původní argument. Tomuto se říká přepínač. V podstatě je to jen další argument, ale začíná na pomlčku, resp. mínus, mění chování příkazu a některé programy vyžadují, aby v seznamu argumentů byly přepínače na začátku, protože pak se může změnit chování příkazu.

Procházení historie příkazů

Zmáčkneme šipku nahoru, a tím se nám budou zobrazovat předešlé příkazy. Zmáčkneme ji tolikrát, abychom se dostali zpět na příkaz echo Ahoj. Opačným směrem lze posouvat šipkou dolů (třeba když šipku nahoru zmáčknete víckrát než jste chtěli).

Po napsání několika stovek řádků příkazů bude hledání některého staršího pomocí šipek nahoru a dolů docela neúčinné a zdlouhavé. Existuje proto zkratka Ctrl-R kterou se příkazová řádka přepne do hledacího režimu. Pokud začneme cokoliv psát, tak bude hledat v historii řádek/příkaz, který má tento řetězec v sobě obsažen. Jde o takzvané „inkrementální hledání“, znamená to tedy, že při napsání e se najde nejbližší příkaz obsahující toto písmenko.

Pokud najdeme, co jsme hledali, tak pohybem v příkazu (šipky doleva nebo doprava) se příkazová řádka přepne zpět do režimu zadávání (editace) příkazu s nalezeným příkazem již předvyplněným. Stiskem Enter se přímo vykoná (i pokud jsme v režimu hledání). Pokud jsme nenašli to, co jsme hledali, tak můžeme resetovat příkazovou řádku zpět pomocí Ctrl-C.

Pro hledání dalšího výskytu stejného podřetězce stačí opakovat zkratku Ctrl-R. Když bychom tedy začali zpětně hledat jen písmenko e, ale chtěli bychom najít jiný jeho výskyt, tak stačí po jeho zadání opakovat Ctrl-R, dokud nenajdeme, co hledáme.

Editace příkazové řádky

Řádka se dá editovat podobně jako v textovém editoru, tedy posouvat se šipkami doleva a doprava nebo pomocí kláves Home a End. Backspace a Delete fungují také stejně.

[liveuser@localhost-live ~]$ echo Ahoj -n
Ahoj -n
[liveuser@localhost-live ~]$ █

Jak je vidět, tak příkaz echo už nepochopil -n jako přepínač, ale jako další slovo, které má vypsat. Ne u všech příkazů to takto bude fungovat, proto je dobré myslet na to, že špatné pořadí argumentů může být příčinou neočekávaného chování.

Doplňování názvů příkazů

Místo toho, abychom psali echo, tak napíšeme jen ec a potom zmáčkneme Tab. Pokud je echo jediný spustitelný příkaz nebo program začínající na ec, tak se automaticky doplní na echo. Pokud není, tak se nic nestane (možných příkazů je víc a shell neví, který doplnit).

Zmáčkněte Ctrl-C (zobrazí se jako ^C), čímž se zruší aktuální vstup a můžeme si vyzkoušet druhý případ doplňování. Napište jen e a zmáčkněte Tab a nic se nestane. Při druhém zmáčknutí se objeví všechny příkazy začínající na e. Pokud je dost místa v terminálu, aby se zobrazily najednou, tak se jen zobrazí, ale pokud ne, tak se začnou vypisovat po stránkách (poslední řádek terminálu bude zobrazovat -- More --).

Mačkáním mezerníku posouváme o stránky, dokud se nevypíší všechny. Zmáčkneme znovu Ctrl-C a napíšeme echo Ahoj vsichni kolem a zmáčkneme Enter (nepište celý příkaz echo, ale použijte Tab). Takhle nějak by to mělo vypadat po tom všem, co jsme si vyzkoušeli:

[liveuser@localhost-live ~]$ echo^C
[liveuser@localhost-live ~]$ e^C
[liveuser@localhost-live ~]$ echo Ahoj vsichni kolem
Ahoj vsichni kolem
[liveuser@localhost-live ~]$ █

Tam, kde je vidět ^C, tak jsme zmáčkli Ctrl-C. Jde o zkratku, která nejen ukončuje aktuální vstup a resetuje shell na nový řádek. Krom toho se tím dá ale (většinou) přerušit i aktuální běžící program.

Kopírování a vkládání přes schránku

Terminál umožňuje jak kopírování a vkládání. Pokud něco označíme, tak i bez jakýchkoliv klávesových zkratek to můžeme rovnou vložit kliknutím prostředního tlačítka myši (popř. adekvátním hmatem, nejčastěji trojdotek, na touchpadu) tam, kam chceme text vložit. Ctrl-C a Ctrl-V nebudou dělat to, na co můžete být normálně zvyklí.

Zadávání parametrů

Šipkou nahoru načteme předchozí příkaz a pomocí Ctrl-<šipka vlevo> a Ctrl-<šipka vpravo> se posuneme mezi slova Ahoj a vsichni a přidáme pár mezer. Po zmáčknutí Enter to bude vypadat takto:

[liveuser@localhost-live ~]$ echo Ahoj     vsichni kolem
Ahoj vsichni kolem
[liveuser@localhost-live ~]$ █

Výstup vypadá tak, jak vypadá, protože příkaz echo dostal tři parametry (předali jsme mu tři argumenty), ale neví, jak jsme je oddělili. V základním nastavení oddělují mezery, tabulátory a nové řádky jednotlivé argumenty, ale tyto rozdělovače se nepředávají spouštěnému příkazu. Jak tedy předáme více mezer? Zkuste toto (a použijte zase šipku nahoru a šipky doleva a doprava s Ctrl:

[liveuser@localhost-live ~]$ echo "Ahoj     vsichni" kolem
Ahoj     vsichni kolem
[liveuser@localhost-live ~]$ █

Uvozovky vytváří řetězec, který se dál nerozděluje. Příkazu echo v tomto případě předáváme dva argumenty, prvním je řetězec v uvozovkách a druhým je slovo „kolem“. Taktéž fungují jednoduché uvozovky:

[liveuser@localhost-live ~]$ echo 'Ahoj     vsichni' kolem
Ahoj     vsichni kolem
[liveuser@localhost-live ~]$ █

Pokud u posledních příkazů zapomenete jednu uvozovku, tak to bude vypadat po zmáčknutí klávesy Enter takto:

[liveuser@localhost-live ~]$ echo 'Ahoj     vsichni kolem
> █

Samozřejmě se z toho dá vyskočit pomocí Ctrl-C tak, jak to již známe. Co se to ale děje? Příkaz, který jste psali, není ukončen. To signalizuje znak > na začátku řádku. Uvozovky v tomto případě musí být párové a způsobují to, že syntakticky příkaz ještě neskončil (shell čeká na konec uvozovek). Toho se dá využít při psaní dlouhých a složitých příkazů. V našem případě by stačilo zadat jednoduchou uvozovku a příkaz potvrdit klávesou Enter. Nový řádek za slovem „kolem“ by se vypsal, protože je součástí řetězce v uvozovkách.

Řetězení příkazů

Dalším speciálním znakem je středník. V příkazové řádce odděluje jednotlivé příkazy. Pokud tedy naše první dva příklady napíšu po jednom, bude to vypadat následovně:

[liveuser@localhost-live ~]$ echo
 
[liveuser@localhost-live ~]$ echo Ahoj
Ahoj
[liveuser@localhost-live ~]$ █

Pokud je ale dám na jeden řádek a oddělím středníkem, bude to vypadat takto:

[liveuser@localhost-live ~]$ echo; echo Ahoj
 
Ahoj
[liveuser@localhost-live ~]$ █

Úkol: Co by byl výstup následujících příkazů?

Zobrazení obsahu souboru

Spustíme program cat a jako argument mu dáme /etc/hostname (nezapomeňte na tabulátor):

[liveuser@localhost-live ~]$ cat /etc/hostname
localhost-live
[liveuser@localhost-live ~]$ █

Příkaz vypíše obsah souboru, který mu zadáme, v našem případě soubor /etc/hostname, který obsahuje název hostitele. Popsáno detailněji, program čte soubor, dokud nedojde na jeho konec, a pak skončí. Pokud mu parametr nezadáme, tak čte z klávesnice (konkrétněji standardního vstupu) a co přečte, to vypíše. Program tedy nerozlišuje, jestli čte ze souboru, nebo od uživatele. Zkusíme to:

[liveuser@localhost-live ~]$ cat
asdf
asdf
 
 
neco
neco

Já jako uživatel jsem v tomto případě napsal tři řádky, na prvním bylo asdf, druhý byl prázdný a třetí obsahoval slovo neco. Jak se ale dostat k tomu, abych mohl psát zase zpátky další příkazy? Můžu buď použít zkratku, o které jsme si již říkali (Ctrl-C), ta by ale znamenala abnormální přerušení programu. To znamená, že pokud by program měl něco udělat po přečtení celého souboru či vstupu, tak by to neudělal, místo toho by rovnou skončil. Jak jsme si ale říkali, tak program cat čte, dokud se nedostane na konec souboru. To, abychom programu řekli, že už nechceme zadávat nic dalšího, lze „říct“ zkratkou Ctrl-D na novém řádku. (Jde to i mimo nový řádek, ale zase to skrývá různá úskalí.)

Ukončení zadávání vstupu

Náš shell (v našem případě bash) je také jen program. Čte ze vstupu, ale místo toho, aby každý řádek vypisoval tak, jak ho přečetl, tak jej vykoná jako příkaz. Jak si to vyzkoušet? Zkusíme ho spustit:

[liveuser@localhost-live ~]$ bash
[liveuser@localhost-live ~]$ █

Vypadá to jakoby se nic nestalo, ale pravdou je, že nyní běží dva programy bash. První (který spustil při svém startu program Terminál) vypsal první řádek (prompt), přečetl od nás příkaz bash, vykonal jej a nyní čeká, až se ukončí. Druhý řádek vypsal právě námi puštěný druhý program bash. Zkusíme to ještě jednou?

[liveuser@localhost-live ~]$ bash
[liveuser@localhost-live ~]$ bash
[liveuser@localhost-live ~]$ █

Teď nám běží tři naráz. První čeká na dokončení druhého, druhý na dokončení třetího a ten čeká na nás, až mu řekneme, co má dělat. Jak zjistíme, kolik shellů máme puštěných „v sobě“? Příkaz vypadá takto (pozor, záleží na malých a velkých písmenkách):

echo $SHLVL

Pokud ho nyní spustíme (nezapomeňte na tabulátor, jak u názvu příkazu tak i u jeho argumentu), tak by nám měl vypsat číslo 4 (v prvním shellu běží desktopové prostředí, druhý shell byl spuštěn programem Terminál a třetí a čtvrtý jsme spustili my příkazem bash). Ukončíme tedy poslední bash pomocí příkazu exit (příkaz pro ukončení shellu) a zjistíme znovu, kolik shellů máme puštěných v sobě:

[liveuser@localhost-live ~]$ exit
[liveuser@localhost-live ~]$ echo $SHLVL
3
[liveuser@localhost-live ~]$ █

Zmáčkneme Ctrl-D. Vypadá to, že se jen vypsal další řádek. Pokud ale znovu použijeme příkaz echo $SHLVL (tabulátory!), tak zjistíme, že se ukončil další shell, protože se nám vypsalo zase menší číslo. Co se tedy stalo? Protože bash zjistil, že nechceme psát další příkazy (z jeho pohledu došel na konec souboru či vstupu), tak se ukončil. A funkci převzal první, prapůvodní bash, který byl spuštěn programem Terminál.

Stejně jako bash, tak i Terminál jen pustí program a čeká až se ukončí. A po jeho skončení se ukončí i sám terminál. Pokud tedy znovu zmáčkneme Ctrl-D, tak se zavře i okno programu Terminál. Je to to stejné jakoby jsme napsali příkaz exit.

Získání administrátorských práv

V Linuxu existuje administrátorský účet (root, superuser), který má plné oprávnění. Z bezpečnostních důvodů se za něj nepřihlašuje. Je však možné jeho prostřednictvím spouštět příkazy. Toho lze dosáhnout tím, že před příkaz zadáme slovo sudo. Tento název vznikl z anglického superuser do, tedy „superuživateli, udělej (něco)“. A právě to něco jsou argumenty tohoto příkazu. Předtím, než je příkaz za administrátora puštěn, tak se nás program sudo může zeptat na heslo. Nejčastěji se ptá na heslo přihlášeného uživatele.

To, jestli jste oprávněni pouštět příkazy za administrátora není tedy dáno tím, jestli znáte jeho heslo, ale tím, jestli jste k tomu oprávněni, což byste na svém počítači být mohli. Pokud tedy pustíme sudo echo Ahoj, spustí se příkaz echo s argumentem Ahoj s plnými právy. Vzhledem k tomu, že na vypsání textu moc práv potřeba není, nebude v chování rozdíl, snad jen na tu část, kdy se nás sudo bude ptát na heslo.

Jak tedy nejjednodušeji zjistit, jestli se příkaz pustil za superuživatele? Zkusíme pustit přímo bash (podobného výsledku bychom dosáhli pomocí přepínače -s, tedy pomocí příkazu sudo -s):

[liveuser@localhost-live ~]$ sudo bash
[root@localhost-live liveuser]# █

Změnilo se nám pár věcí v promptu. Hlavní věcí je konkrétní uživatel (v tomto případě z liveuser na root). Cesta již není ~ a místo $ je na konci promptu # (ukazatel přepnutí na administrátora). Zmáčkneme Ctrl-D a jsme zpět normální uživatelé. Toto přepínání se ale příliš nedoporučuje.

Pokud zapomenete, že jste přepnutí na administrátora a nějaký příkaz spustíte omylem, tak můžete způsobit větší škodu než za normálního uživatele. Používejte tedy příkaz sudo jen na puštění jednotlivých příkazů a ne na dlouhodobé nabytí práv.

Přehled klávesových zkratek a funkčních znaků

Práce se soubory a adresáři

Systém súborov (file system)

Systém súborov v Linuxe je organizovaný v jednej stromovej štruktúre.

Koreň tohoto systému (file system root) sa označuje ‘/’ a každá absolútna cesta preto začína týmto symbolom.

Prvá úroveň systému súborov je bežne rozdelená na nasledujúce adresáre:

Pozn.: Toto rozdelenie nie je striktné, avšak vačšina bežných aplikácií ho dodržuje (vínimka: /proc, /sys, /boot).

Prehľad základných príkazov

$ pwd
/home/user1/
$ ls
Documents  Downloads  Games  Music  Pictures  Private  Public  Templates  Videos
$ pwd
/home/user1/Documents

$ cd ../Pictures
$ pwd
/home/user1/Pictures

$ cd -
$ pwd
/home/user1/Documents
$ tree ~
(Zobrazí stromovú struktúru domovského adresára -> Vyskúšajte sami.)
$ find /etc -name httpd
/etc/httpd
/etc/logrotate.d/httpd
/etc/sysconfig/httpd

Modifikácia

$ mkdir novy_adresar

$ mkdir novy_adresar/druhy/treti/posledny
mkdir: cannot create directory 'novy_adresar/druhy/treti/posledny': No such file or directory

$ mkdir -p novy_adresar/druhy/treti/posledny
$ tree
.
└── novy_adresar
    └── druhy
        └── treti
            └── posledny
$ rmdir novy_adresar/
rmdir: failed to remove 'novy_adresar/': Directory not empty

$ rmdir novy_adresar/druhy/treti/posledny/
$ tree
.
└── novy_adresar
    └── druhy
        └── treti
$ touch subor1
$ touch novy_adresar/subor2 novy_adresar/druhy/subor3
$ tree
.
├── novy_adresar
│   ├── druhy
│   │   ├── subor3
│   │   └── treti
│   └── subor2
└── subor1
$ ls
novy_adresar  subor1

$ rm subor1
$ ls
novy_adresar

$ rm -r novy_adresar/druhy
$ tree
.
└── novy_adresar
    └── subor2
$ echo Hello world!
Hello world!

Čítanie

"Divoké karty" ("Wildcards")

Pri práci s príkazovou riadkou sa často stretneme s potrebou vykonať nejaký príkaz pre viacero rôznych súborov, ktoré však majú nejakú spoločnú vlastnosť (napr.: presunúť všetky súbory s príponou .txt).

Abychom nemuseli takéto súbory zadávať po jednom, existujú pomocné skratky, tzv. divoké karty (wildcards) (analógia: regulárne výrazy).

$ mv /tmp/*.txt ~/

Presunie všetky súbory s príponou .txt z adresáru /tmp do domovského adresára.

$ rm /tmp/test*

Odstráni z adresáru /tmp všetky súbory začínajúce retazcom test.

Na zamyslenie: Aký je rozdiel medzi nasledujúcimi príkazmi?

$ rm -rf /tmp/*
$ rm -rf /tmp/
$ mkdir adresar{A..N}
$ ls
adresarA  adresarC  adresarE  adresarG  adresarI  adresarK  adresarM
adresarB  adresarD  adresarF  adresarH  adresarJ  adresarL  adresarN

Na zamyslenie: Čo spraví nasledujúci príkaz?

$ touch subor{1..9}{1..9}

Presmerovanie

Pre presmerovanie vstupu / výstupu sa používajú nasledovné znaky:

Štandardné vstupy / výstupy sú tiež označené číslami nasledovne:

Taktiež existuje špeciálny súbor /dev/null, ktorý funguje ako “čierna diera”, resp. “nič” (prípadne tzv. “void”). Všetko, čo je do tohoto súboru zapísané, je zahodené. Napríklad je často užitočné do tohto súboru presmerovať chybový výstup, keď nás chybové hlásenia nezaujímajú:

príkaz 2> /dev/null

Presmerovanie sa používa cielene so súbormi.

Pre predávanie výstupu ďalším príkazom sa používajú “roury” (pipe).

Roury (pipe)

Rúry sa používajú pre zreťazenie viacerých príkazov do jedného, prostredníctvom prepájania ich výstupov so vstupmi. Zapisuje sa znakom |.

Syntax: "príkaz1 | príkaz2"
Prepojí výstup príkazu-1 na vstup príkazu-2.

Prikazy sa daju sekvenčne zapojit aj viac krát v jednom príkaze.

$ ls /usr/bin | grep yum
yum
yum-builddep
yum-config-manager
yum-debug-dump
yum-debug-restore
yum-deprecated
yumdownloader
yum-groups-manager

Nasledujúci súbor numbers.txt obsahuje nahodné čísla 0-10.

$ cat numbers.txt | sort | uniq -c
      2 0
      3 1
      5 2
      5 3
      6 4
      4 5
      3 6
      5 7
      4 8
      3 9

Tento príkaz spočítal výskyt každého čisla v súbore numbers.txt.

Práce s textem, vstupem a výstupem

V príkazovej riadke je bežný prípad, že potrebujete spracovať výstup nejakého príkazu. Taký klasický príklad je: máte súbor a hľadáte v ňom kľúčové slovo. Alebo máte adresár a hľadáte kľúčové slovo v ktoromkoľvek súbore, ktorý sa nachádza v spomínanom adresáre.

Na hľadanie kľúčových slov je najpoužívanejší príkaz grep. Teraz vás poprosím si pozrieť manuálovú stránku tohto príkazu ako aj nápovedu. (Úloha: ako to spraviť?)

Poďme si teraz skúsiť reálne použitie.

Naša úloha bude, že sa snažíme nájsť reťazec PATH v súbore /etc/bashrc.

$ grep PATH /etc/bashrc
        case ":${PATH}:" in
                    PATH=$PATH:$1
                    PATH=$1:$PATH

Reťazec sme našli. Mohli by sme dostať aj čísla riadkov?

$ grep -n PATH /etc/bashrc
58:        case ":${PATH}:" in
63:                    PATH=$PATH:$1
65:                    PATH=$1:$PATH

Kde všade môžeme ešte kľúčové slovo PATH nájsť v /etc/?

$ grep -R PATH /etc/
grep: /etc/pki/tls/certs/ca.crt: Permission denied
grep: /etc/pki/rsyslog: Permission denied
grep: /etc/ssh/sshd_config: Permission denied
grep: /etc/ssh/ssh_host_rsa_key: Permission denied
grep: /etc/ssh/ssh_host_ecdsa_key: Permission denied
grep: /etc/ssh/ssh_host_ed25519_key: Permission denied
grep: /etc/ssh/sshd_config.rpmnew: Permission denied
/etc/bashrc:        case ":${PATH}:" in
/etc/bashrc:                    PATH=$PATH:$1
/etc/bashrc:                    PATH=$1:$PATH
Binary file /etc/udev/hwdb.bin matches
/etc/csh.login: switch (":${PATH}:")
…

Spomínate si ešte na presmerovanie? Poďme si presmerovať štandardný chybový výstup z predchádzajúceho príkazu do súboru s názvom chyby. Úloha: ako na to?

Úloha: presmerujte teraz obsah štandardného výstupu do súboru.

Premenné prostredia

Každý linuxový proces ma množinu premenných prostredia, ktoré sú mu dostupne. Veľmi ľahko si ich môžeme všetky vypísať pomocou príkazu env. Rovnako môžete tieto premenné ľahko zadefinovať sami a využívať ich v príkazovej riadke pomocou konštruktu $MENO_PREMENNEJ. Teraz si vypíšeme obsah premennej prostredia PATH:

$ echo $PATH

Ľahko si môžeme zadefinovať vlastnú premennú a pouziť ju:

$ export TAJNY_SUBOR=/etc/bashrc

a následne v tomto tajnom súbore niečo nájsť:

$ grep PATH $TAJNY_SUBOR

Tvorba jednoduchého skriptu

Všetko príkazy, ktoré sme doteraz zadali do príkazovej riadky, môžeme zapísať do súboru a vykonať sekvenčne:

$ vim nas-prvy-skript.sh
export TAJNY_SUBOR=/etc/bashrc
grep PATH $TAJNY_SUBOR

a následne vykonať:

$ bash nas-prvy-skript.sh

Náročná úloha: napíšte do príkazovej riadky cat a následne skúška a potvrdte enterom. Dokážete popísať, co sa práve deje?

Úprava souború pomocí terminalového editoru

Jeden z najrozšírenejších a najviac používaných CLI textových editorov je vi. Editor vi je predinštalovaný na každom linuxovom systéme a poskytuje množstvo užitočných príkazov na editovanie súborov.

Prvé spustenie

Textový editor sa spúšťa pomocou príkazu vi. Ako argument je mu predaný názov súboru, ktorý sa chystáme upravovať.

Pokiaľ súbor s poskytnutým názvom neexistuje, vi vytvorí nový súbor v aktuálnom adresári.

Po spustení sa príkazový riadok nahradí náhľadom obsahu súboru. Vlnovky označujú prázdne riadky na konci súboru. Vľavo dolu sa zobrazí názov súboru, počet jeho riadkov a znakov alebo informácia o tom, že sa vytvoril nový súbor. Na tomto mieste sa budú zobrazovať aj informácie o iných vykonaných zmenách. V pravo dole je percentuálna alebo slovná reprezentácia pozície v dokumente.

Módy editora

Editor vi má tri používané módy - základný, insert a vizuálny. V základnom móde je konzola pripravená prijímať nové príkazy v podobe jednotlivých kláves alebo slovné príkazy v podobe reťazcov začínajúcich dvojbodkou. Každá klávesa môže mať svoj špecifický význam. Napríklad stlačením klávesy x sa odstráni písmeno na pozícii kurzora alebo stlačením u sa vrátime o krok späť (podobne ako <ctrl>+z v iných editoroch).

Zo základného módu sa stlačením i dostaneme do vkladacieho módu - insert. V tomto móde sa zapisuje nový text, tak ako sme zvyknutí z grafických textových editorov. Naspäť do základného/príkazového módu sa dostaneme stlačením klávesy <Esc>.

Tretí z používaných módov je vizuálny a spúšťa sa pomocou klávesy v. Tu je možné označiť časť textu a previezť na nej nejaký príkaz, napríklad skopírovanie do schránky. Návrat do základného módu opäť vykonáme pomocou <Esc>.

Napravo vidíme aktuálnu pozíciu kurzoru vo formáte riadok,(bajt-)stĺpec 0,0-1. Túto pozíciu a teda kurzor, je možné meniť pomocou šípok alebo kláves h, j, k a l. Okrem toho existuje množstvo skratiek na zjednodušenie orientácie vo veľkých súboroch, napríklad:

Príkazy začínajúce dvojbodkou

Editor vi umožňuje vykonávanie zložitejších výkonov pomocou krátkych interpretácií príkazov. Toto je užitočné napríklad keď je potrebné:

A teraz to najdôležitejšie! Ako to všetko uložiť a vrátiť sa k príkazovému riadku. Na to nám slúžia príkazy začínajúce dvojbodkou v základnom móde:

Ako sa stať kúzelníkom pri editovaní

Obsah toho krátkeho tréningu bol len základ. Editor vi a jeho vylepšený brat vim poskytuje mnoho nástrojov a rozšírení, ktorých osvojením si človek ľahko zrýchli a spríjemní svoje pracovné úkony. Balíček vim-enhanced, ktorý by mal byť súčasťou väčšiny linuxových distribúcií, obsahuje mimo iného aj tutoriál v češtine (na dlhé zimné večery). Spúšťa sa na príkazovom riadku príkazom vimtutor. Na základné, nevyhnutné použitie ale stačí pamätať si postupnosť i, <zmeny>, <Esc> a :wq.

Dotazy a diskuse

Pokládat dotazy a diskutovat o tomto školení můžete v diskusním vlákně na forum.mojefedora.cz.