Bash pro začátečníky/Terminál, manuál a Bash

Jak používat klasifikační nálepkuTato stránka je součástí kurzu:
začátečníci
Příslušnost: všeobecná

Terminál, manuál a Bash

editovat

Vysvětlení manuálové syntaxe

editovat

V tomto oddíle procvičujeme pochopení manuálové syntaxe. V příkazové řádce zadejete man váš příkaz a připište si sem syntaxi. Pak se můžete pokusit s ohledem na man man (manuál manuálů) dovodit, jak se příkaz používá. Když si nebudete jisti, zkuste jiný zápis syntaxe, např. z man7.org, nebo si někde najděte ukázku. Cílem tohoto cvičení je k tomu přistoupit co „nejstrožeji“, tak abysme se naučili nespoléhat na jiné zdroje informací, než lokální manuály a případně objevily a mohli popsat zákonitosti či nedostatky syntaxí manuálů.

Aby bylo jasno tak do subnadpisu uvádíme pokud máme pocit, že jsme danou syntaxi pochopili (vyřešeno) či nepochopili (dořešit).

Příkaz case (dořešit)
editovat

Syntaxe: case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac

Příklad:

x=3
case "$x" in
"1") echo "x se rovná 1" ;;
"2") echo "x se rovná 2" ;;
"3"|"4") echo "x se rovná 3 nebo 4" ;;
*) echo "x je větší než 4" ;;
esac
x se rovná 3 nebo 4

Úvahy:

  • case...je začátek příkazu[1]
  • esac...konec skryptu, vypadá jako case obráceně!
  • WORD.....je slovo, které se srovnává vůči jednotlivým vzorům PATTERN. V tomto případě je WORD $x, tedy řetězec. Uvozovky zde mají zřejmě jen metainformatický charakter.
  • [PATTERN [| PATTERN]...)....asi odpovídá řádku 5 a konkrétně "3"|"4"), tzn. že 3 je jeden vzor (PATTERN) a 4 druhý. Složené závorky ([]) a výpustka (...) se v kódu neobjevují, tzn. že se musí jednat o nějaké metainformace. K příkazu case není manuálová stránka a nápovědu nelze ani vyvolat přes case --help. Funguje pouze help case, kde je ale nepatrné množství informací. V man man se pro [-abc] uvádí, že žádný, nebo všechny arguments (argumenty) v závorkách jsou volitelné. Dále se zde praví, že [expression] ...   znamená, že expression (výraz) se dá opakovat. Otázkou tedy je, jestli PATTERN je argument, nebo výraz. Jediné co je z toho zcela jasné, je to, že složené závorky se v kódu skutečně nepíší a pouze nesou nějakou informaci. Řekněme, že řetězec [| PATTERN]... lze vyjmout a tak nám zbyde jen PATTERN. To by odpovídalo příkazům na řádcích 3, 4 a 6.
  • [PATTERN) COMMANDS ;;] vezměmě hypotézu, že toto je expression a odpovídá třeba řádku 3 kde závorka se nepíše, PATTERN je 1, závorka ) se zapíše, COMMANDS odpovídá příkazu echo, respetive echo "x se rovná 1" a výraz se ukončí středníky ;;
  • Pak se ale můžeme zeptat, proč in není ve složených závorkách a PATTERN ano? Logická odpověď je, že in není výraz. Co ale je potom in? Podle manuálu je in rezervované slovo za určitých případů (jako, že není v uvozovkách či stojí na třetí pozci jako u příkazu case).[2]
  • |.... podle help case je svislík oddělovačem jednotlivých vzorů. Trochu ale nechápu, proč je až uvnitř závorky, přišlo by mi logičtější, kdyby byl zápis následující [PATTERN |[PATTERN]...) COMMANDS ;;]. Znamená to tedy, že svislík neoděluje výrazy, ale vzory? Ovšem pokud by se nejednalo o [PATTERN], ale o [PATTERN]..., pak by možná dávalo smysl, proč není svyslík před závorkou ale za ní ([|PATTERN]...)? A hrají nějakou roli mezery, které jsou kolem značek [|? Protože v uvedeném příkladu kolem vzorů ani svislíku mezery nejsou a když je zkusím dát do skryptu, tak to nemá vliv na výsledek.
  • ... (tři tečky, nebo-li výpustka (původní fonty shellů asi výpistku neměli)) je ve dvou případech v man man uvedeno jako řešení, které uvádí předchozí argument, nebo výraz.
  • Jinak shell přečte celý skrypt interpretuje ho asi postupně, protože když zadám x=0, tak výsledkem je stejně echo z řádku 6.
  • ....mezera se zdá, že v uvedeném příkladu by se mohla úplně zrušit, protože každý výraz je nějakým způsobem ohraničen, ale je – kdyby nebyl. Například proč musí bý čísla uvedena v uvozovkách, ale je to asi proto, že zde nedochází k interpretaci čísel, ale řetězců, tedy jsou to textové řetězce?
Srování různých zápisů syntaxe
editovat
  • case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac“ - terminál
  • case EXPRESSION in CASE1) COMMAND-LIST;; CASE2) COMMAND-LIST;; ... CASEN) COMMAND-LIST;; esac[3]
  • case word in [ [(] pattern [| pattern]...) command-list ;;]... esac[4]
Příkaz cp (vyřešeno)
editovat

Syntaxe man:

  1. cp [OPTION]... [-T] SOURCE DEST
  2. cp [OPTION]... SOURCE... DIRECTORY
  3. cp [OPTION]... -t DIRECTORY SOURCE...

Příklad:

Úvahy:

  1. cp je zkratka příkazu, tedy copy
  2. Podle man man kapitálky nic neoznačují, respetive man man odkazuje na to, že názvy sekcí manuálu se píší kapitálkami. Jde tedy asi o osobní invenci pisatélů manuálu příkazu copy, nebo může jít o jejich způsob zvýraznění.
  3. V man man jsou pouze dva příklady s hranatou závorkou. Jednou jsou ale tučně, podruhé podtrženě. Těžko pak soudit co je co!
  4. Dle manuálu manuálů označuje výpustka to, že daná věc před závorkou se dá opakovat. V případě [OPTION]... by se tedy asi dalo několikrát zopakovat, to co je před třemi tečkami. Otázka ovšem je, jak to zapsat, když neznáme pravidla pro 3. V případě SOURCE... a DIRECTORY SOURCE... (je otázka pro jakou část syntaxe se ve třetím případě opakovatelnost vztahuje, jestli pro SOURCE, DIRICTORY SOURCE, nebo dokonce pro -t DIRECTORY SOURCE) opakovatelnost zdroje či zdrojového adresáře. Dalším problémem manuálu cp je, že neobsahuje sekci Options, hned by bylo jasné, co [OPTION] může znamenat.
  5. Man man píše, že něco jako [-T] znamená, že jsou argumenty volitelné. Žel bohu se opět man man a man cp liší v tom, že v man man jsou argumenty na rozdíl od man cp tučně. Z prostého vzhledu lez ale dovodit, že v případě man cp se jedná skutečně o argumenty. Otázka, která tady vyvstává, je ale co to znamená [OPTION]... [-T], protože dle formátu v man man by OPTIONS měly být také argumenty. Kdyby tomu bylo stejně i v případě man cp, pak je tento název syntaxe zbytečně složitý. Může to tedy znamenat, že Option není argument. Tady už začíná vyvstávat moc otazníků a hypotéz, zkusme zápis z man7.org
    1. Z vysvětlení, které poskytl chatGPT ale plyne, že výrazy [OPTION]... a [-T] označují trochu něco jiného. Zatímco [OPTION]... označuje možnosti, které se dají opakovat, [-T] ty, které se opakovat nedají. Takto vysvětleno to dává smysl, proč jsou de facto zapsány dvě totožné věci. Další možnosti, které se nedají opakovat jsou podle chatGPT -r, -u a -n. Ostatní jsou tedy opakovatelné (viz man cp). V man man je sekce s těmito flagy skutečně označena jako Options, tože v man cp tomu tak není může být chyba či nedbalost. Důvod pro použití -T v příkazu je pak zcela jasný – zdůrazňuje to, že tuto možnost nelze opakovat (nicméně jistě by se to dalo zapsat i jinak, například [option]... [option], případně [-a]... [-T] (jenom připomínám, že kurziva zde značí řetězec, který má být nahrazen argumentem a tučný text řetězec, který se musí zapsat tak jak je). Nicméně, když na ten druhý příkaz koukám, tak si nejsem jistý jestli je přesný. Oba jsou v závorce, to znamená, že mohou a nemusí být použity. Když použity budou, pak si nejsem jistý, jestli fakt, že jsou tučným písmem, je tam nevnucuje explicitně.)
  6. Podle dovysvětlení první syntaxe AI by se pak dalo říct, že u druhé syntaxe cp [OPTION]... SOURCE... DIRECTORY, to znamená, že mohu za příkaz cp vložit nějakou možnost, respetive možností může být víc (nepřipouští to tedy možnosti, které nejde opakovat?), následuje jeden nebo více zdrojů (například baf1.txt, baf2.txt) a následně název adresáře, kam se to má kopírovat.
  7. A konečně třetí příklad syntaxe cp [OPTION]... -t DIRECTORY SOURCE... by pak znamenal, že za příkaz cp mohu vložit možnost nebo možnosti, musím uvést možnost -t a následně mi to není jasné. Jen vím, že adresář je jeden a zdrojů může být vícero.
    1. Tak po diskusi s AI z toho plyne, že argument -t umožní zadat napřed cílový adresář a vše ostatní jsou kopírované soubory či adresáře. ChatGPT dále upozorňuje, že tato možnost, nemusí být u všech verzí příkazu cp a pokud tomu tak není, tak se holt musí použít standardní postup ve formátu příkaz, argumenty, kopírovaný soubor či aresář a cílové místo.

Syntaxe man7.org:

  1. cp [OPTION]... [-T] SOURCE DEST

Úvahy:

  1. Bohužel zde, je syntaxe velmi podobná manuálu! Nicméně cp tučně by mělo znamenat, že se musí zapsat, tak jak je. To je ostatně logické.
  2. V man man se píše, že se má kurziva nahradit patřičným argumentem. Tady je kurzivou skoro vše, což není na škodu, protože vše za příkazem jsou de facto argumenty.
  3. Připusťme tedy, že man man říká, že to co je v závorce je volitelné. Znamenalo by to tedy, že jediným nevolitelným argumentem je v tomto případě SOURCE DEST, což asi znamená zdrojové umístění. Takový příkaz by pak mohl vypadat třeba cp /home/juan/avidemux2, ale je otázka co by takový příkaz udělal? Když si něco takového vyzkouším, tak mi cp hlásí chybu: missing destination file operand after '/home/juan/test'. Znamená to tedy, že chybí cílové umístění. Zdá se tedy, že příkaz cp /home/juan/test je chápán jako okopíruj /home/juan/test někam a ptá se kam. Nefunguje to ani, když je aktuálním adresářem test a když zadám vytvořený test2. Z tohoto rozboru tedy plyne, že tento zápis syntaxe, není asi správný.
    1. ChatGPT poskytl následující příkaz cp file.txt directory/ # Copies 'file.txt' into 'directory/file.txt'. To znamená, že jsem synopsy pochopil špatně a SOURCE DEST jsou dva výrazy, ne jeden. Napřed jde zdrojový sobour (adresář), pak jde ten kam se to má uložit.
  4. A skutečně při kopírování sobourů (ne pří kopírování adresářů) to funguje. Například cp /home/juan/test/baf.txt /home/juan/test2/ překopíruje soubor baf.txt do adresáře test2.

Shrnutí:

Syntax tedy znamená, že po zápisu názvu příkazu copy, tedy cp se mohou vložit atributy z čehož některé jsou opakovatelné a jiné ne a následné se vkládají soubory a adresáře, či cesty k nim a cílové umístění. Některé verze příkazu cp, pak umožňují prohodit zdroj a umístění díky vložení atributu -t (cp [OPTION]... -t DIRECTORY SOURCE...). Dále se dá říct, že manuál příkazu cp se neřídí syntaxí uvedenou v manuálu manuálů.

Snap find (dořešit)
editovat

Syntaxe man: snap [OPTIONS] find [find-OPTIONS]

Úvahy:

  1. snap je název příkazu
  2. [OPTIONS] - man man nezná něco co je kapitálkama, v man man jsou options název sekce, ve které jsou možnosti či argumenty
  3. find - je v man snap označen jako Option command, man man žádný Option command nezná, ale mohl by to být příkaz, který jde užívat s jiným příkazem. A skutečně existuje příkaz find, který má i svůj manuál a synopsy (find  [-H]  [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]).
  4. [find-OPTIONS] - opět jako v případě bodu 2 man man nezná něco s kapitálkama, stejně jako Options jsou pro něj atributy. Jinak man snap nemá sekci Options, pouze Option Commands. Man find má sekci Options a jsou tam atributy. Man snap nijak nerozvádí co by to měly být ty Options.

Shrnutí:

  • Z výše uvedeného tedy můžeme s jistotou říci, že lze spojit dva příkazy (v tomto případy snap a find).
  • Nemůžeme s jistotou říct, co jsou OPTIONS a jak se chovaj, můžem pouze předkládat hypotézy:
    1. H: Pro snap jsou OPTIONS možnosti v sekci Option Commands
    2. H: Pro find jsou OPTIONS možnosti v sekci Options v manuálu find (proto je to označeno jako find-OPTIONS)
    3. H: Závorka se v příkladu nezapíše.
    4. H: OPTIONS se nahradí jedním, nebo vícero jinými příkazy
    5. H: Stejně tak find-OPTIONS se nahradí jedním nebo víceropříkazy
  • Trochu matoucí je ale zápis typu [OPTIONS] find, když víme, že find by teoreticky mohl být součástí výrazu OPTIONS. Ale na druhou stranu k přihlédnutí k tomu, že se tento zápis synopse nachází v sekci Option Commonds:find můžeme říct, že to smysl dává a prostě to značí, že před find může být jeden a více příkazů a že find sám může mít jeden a více atributů.
  • Co z toho ale není jasné, jestli tam vždy musí být nějaké OPTIONS, nebo někdy ne
notify-send (vyřešeno)
editovat

Syntaxe man: notify-send [OPTIONS] {summary} [body]

Výklad dle man man:

  • notify-send - první jde samotný příkaz, to je jasné a dokonce je tučně, takže se musí zapsat, tak jak je.
  • OPTIONS - man man o žádných kapitálkách nemluví, takže OPTIONS bude asi čistý výmysl tvůrců notify-send a zřejmě zvýraznění, protože mají v manuálu sekci Options
  • [OPTIONS] - argumenty v [] by měly být volitelné. Co jsou to argumenty? --> Jsou to ty věci co jsou v sekci Options (např. -u, -t, -i).
  • {summary} - man man žádnou notaci o složených závorkách ({}) nezná, takže je to zase o hypotézách, co se tím tvůrci notify-send snaží sdělit. Summary značí shrnutí, jaké shrnutí tím myslí, těžko říct a jakou funkci to shrnutí má také.
  • [body] - dle man man nevíme co je body. Víme, ale, že hranaté závorky značí volitelnost
  • Shrnutí: zatím víme, že musíme napsat příkaz (notify-send), pak můžeme zvolit atributy (-?, -u, -t), pak nevíme co dělat a pak můžeme zvolit nějaké tělo. Ovšem nevíme co to tělo je.

Dovýklad dle man notify-send:

  • Tak tady odtud není co dovyložit.

Na man7.org k tomu manuál není, takže smůlec!

ChatGPT 4:

  • [OPTIONS] - 4ka souhlasí, že todle je volitelná část, kam se mohou zapisovat atributy ze sekce Options
  • {summary} - toto je údajně nadpis v notifikaci, a skutečně se to po otestování tak chová
  • [body] - je samotný text notifikace.
  • Shrnutí: po ozkoušení mohu potvrdit, že to tak funguje. Příkaz notify-send je povinný a neměný, [OPTIONS] jsou volitelné atributy ze sekce Options z manuálu k notify-send. Prostě nahradím [OPTIONS] nějakým atributem (např. -t 10000). {summary} je povinný nadpis oznámení. Prostě nahradím {summary} nějakým řetězcem. [body] je volitelný text oznámení. Prostě nahradím [body] nějakým řetězcem. Příklad:
  • notify-send -t 10000 "Test" "Todle je pouze test!"
    
rm (dořešit)
editovat

Syntaxe man: rm [OPTION]... [FILE]...

Výklad dle man man:

  • rm - nejprve jde příkaz, je označen boltem, tzn. že musí být zapsán tak jak je
  • [OPTION]... [FILE]... - jsou nějaké proměné, které se vkládají podle nějakých pravidel, nevím, ale jak se to obecně jmenuje
  • [OPTION]... - man man žádný zvýraznění kapitálkama nezná, pak se těžko určí co to znamená, když je to v závorce. Tak dejme hypotézu, že OPTION je jeden argument a tím že je v závorce, by pak znamenalo, že je volitelnej. Výpustka (...) tedy bude znamenat, že se to může opakovat. Celé by to mohlo znamenat, že tam může být několik argumentů, které se mohou opakovat. Proč to tedy nazapsat podle pravidel man man následovně: [-abc]...?
  • [FILE]... - toto je podobný příklad jako výše, kdy se musíme domnívat. Vzhledem k tomu, že rm maže soubory, FILE bude asi název souboru. Opět není jasné, proč je to kapitálkama. To že je to v závorce znamená, že je to volitelné a že se to může opakovat?
  • suma sumárum - znamenalo by to, že atributy a soubor jsou volitelné, nebo může být jeden, nebo se můžou opakovat?
unrar (dořešit)
editovat

Syntaxe man: unrar  command  [-switch ...] archive [file ...] [@listfiles ...] [path ...] [path_to_extract/]

Výklad dle man man a man unrar:

  • unrar - příkaz, je poviný
  • command - i dle man unrar to vypadá, že pokud chceme využít nějaký příkaz, musíme zapsat slovo command
  • [-switch ...] - asi že, to nemusí obsahovat žádný argument, argumenty jsou volitelné a mohou se opakovat (výpustka)
  • archive [file ...] - z logiky věci a man man by to mohlo znamenat, že musím zapsat slovo archive a následně název jednoho, nebo více souborů typu rar. Nicméně z popisu v man unrar není zcela jasné, jestli se musí archive zapsat. Co je ale jasné, že file není pouze název raru, ale cesta k raru či rarům.
  • [@listfiles ...] - zase to že je to v závorce značí volitelnost a výpustka opakovatelnost. Podle man unrar to vypadá, že listfile je plain text soubor obsahující cesty k rarům. Každá cesta musí být na separátní řádce. Do příkazu se vloží zavináč a následně jméno souboru s listem. Asi z logiky věci spíš cesta k souboru se seznamem rarů.
  • [path ...] - z logiky věci bych řekl, že se sem vkládá nějaká cesta k souboru, který se má rozbalit. Je to volitelné a opakovatelné. Jinak řečeno, je to jedna z možností pro archive (ostatní jsou tedy [file ...] [@listfiles ...] [path ...] [path_to_extract/]). Otázka je jaký je rozdíl mezi [file ...] a [path ...]. Man unrar path nevysvětluje.
  • [path_to_extract/] - zde to opět vypadá na cestu k raru, respektive rarům, protože lomítko může označovat cestu do konkrétního adresáře, kde jsou rary. Nedá se to opakovat, ale je to volitelné. Dle man unrar asi jo.

Výklad dle man7.org: manuál chybí.

ChatGPT 3.5: unrar [options] archive.rar [files...]

  • unrar - příkaz, je poviný
  • [options] - volitelné možnosti, které příkaz nabízí
  • archive.rar - jméno raru k rozbalení
  • [files...] - další soubory či adresáře k rozbalení, z tohodle vysvětlení by to teda asi začátečník nepochopil

Shrnutí:

  • úplně nejlepší by asi bylo, kdyby manuálové stránky obsahovaly příklady, než nějaké suché manuály.
  • je otázka jaké je rozdíl mezi sekcí commands a options v man unrar. Man man s žádnou sekcí commands nepočítá.

Struktura manuálu a Bashe

editovat

Tato sekce je speciálně vypíchnutá a věnuje se speciálně manuálovým stránkám Bashe.

Manuál k příkazům voláme příkazem man něco, dokonce i příkaz man má svůj manuál volatelný přes man man. Ne všechny příkazy ale manuál mají, někdy musíte zkustit příkaz --help. Případně se dají manuálové stránky najít na webu, kde jsou i barevně podbarvené.

Č. Otázka Odpověď Poznámky
1 Co to znamená man? Manual
2 Jak rozumět sekci synopse?
3 Jaké jsou způsoby pro jasné zvýraznění synopse? Například nainstalovat aplikaci most.
4 K čemu je příkaz intro? Obsahuje návod pro práci v příkazové řádce.
5 Proč řádka nevykresluje tučné písmo? Asi není zapnuté. Zapne se: Edit-Profile Preferences-General-Allow bold text.
6 Proč řádka nevykresluje kurzivu? Může za to sázecí jazyk roff, který se stále používá a kurzivu neumí, takže kurziva se vykresluje jako podtržené písmo.[5]
7 Jak zjistím jaký pager používá příkaz man?
Poznámky z manuálu
editovat

Přečtěte si manuál k Bash a níže zanehte své postřehy, otázka a myšlenky.

  • chápu to dobře, že shell je operační systém?
  • pokud soubory fungují jako příkazy, jak se dá spustit třeba /bin?
  • token je sekvence jednoho a více znaků. Tokenem může být slovo, nebo operátor.
  • metacharacter (metaznak) je znak, který odděluje slova pokud není označen uvozovkami (mezera, tabulátor, nová řádka, ‘|’, ‘&’, ‘;’, ‘(’, ‘)’, ‘<’, nebo ‘>’.
  • vysvětlení slova operátor je skoro jak vysvětlení v kruhu!
  • bash obsahuje stejne build in příkazy jako Bourne Shell (sh)
Gramatika Bashe
editovat

Cílem této sekce je společně vytvořit gramatiku Bashe (či linuxácké mluvy), to vysvětlit jednotlivé terminy jako (arguments, expressions) a popsat funkci metainformací a dále logiku skládání jednotlivých znaků při skryptování.

Slovníček pojmů
editovat
  • argument - argument
  • expression
  • operator - operátor, zajišťuje nějakou operaci
  • snap - zkratka pro Snap package, balíček
  • Snap - nástroj pro manipulaci se snapy, tj. balíčky
  • package -
  • argument
  • apt update prý refrešne repozitáře - to co apt update dělá je ale, že updatuje informace o balíčcích dostupných na webu. Se samotnými balíčky, nebo online repozitáři, které jsou na webu dostupné, ale nijak nemanipuluje.

Práce s terminálem

editovat
  • TAB – tabulátor v terminálu doplní rozepsaný řetězec a urychlý tím práci
  1. Bash Reference Manual. www.gnu.org [online]. [cit. 2023-04-18]. Dostupné online. 
  2. Bash Reference Manual. www.gnu.org [online]. [cit. 2023-04-18]. Dostupné online. 
  3. Using case statements. tldp.org [online]. [cit. 2023-04-18]. Dostupné online. 
  4. case Man Page - Linux - SS64.com. ss64.com [online]. [cit. 2023-04-18]. Dostupné online. 
  5. bash - Console doesn't render according to man manual. Unix & Linux Stack Exchange [online]. [cit. 2023-03-28]. Dostupné online. (anglicky)