Bash pro začátečníky/Terminál, manuál a Bash
| 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á jakocaseobráceně!WORD.....je slovo, které se srovnává vůči jednotlivým vzorůmPATTERN. V tomto případě jeWORD $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říkazucasenení manuálová stránka a nápovědu nelze ani vyvolat přescase --help. Funguje pouzehelp case, kde je ale nepatrné množství informací. Vman manse 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, jestliPATTERNje 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 jenPATTERN. 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,PATTERNje1, závorka)se zapíše,COMMANDSodpovídá příkazuecho, respetiveecho "x se rovná 1"a výraz se ukončí středníky;;- Pak se ale můžeme zeptat, proč
innení ve složených závorkách aPATTERNano? Logická odpověď je, žeinnení výraz. Co ale je potomin? 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říkazucase).[2] - |.... podle
help caseje 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ěechoz řá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:
cp [OPTION]... [-T] SOURCE DESTcp [OPTION]... SOURCE... DIRECTORYcp [OPTION]... -t DIRECTORY SOURCE...
Příklad:
Úvahy:
cpje zkratka příkazu, tedy copy- Podle
man mankapitálky nic neoznačují, respetiveman manodkazuje 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í. - V
man manjsou pouze dva příklady s hranatou závorkou. Jednou jsou ale tučně, podruhé podtrženě. Těžko pak soudit co je co! - 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...aDIRECTORY SOURCE...(je otázka pro jakou část syntaxe se ve třetím případě opakovatelnost vztahuje, jestli proSOURCE,DIRICTORY SOURCE, nebo dokonce pro-t DIRECTORY SOURCE) opakovatelnost zdroje či zdrojového adresáře. Dalším problémem manuálucpje, že neobsahuje sekci Options, hned by bylo jasné, co[OPTION]může znamenat. Man manpíše, že něco jako[-T]znamená, že jsou argumenty volitelné. Žel bohu se opětman manaman cpliší v tom, že vman manjsou argumenty na rozdíl odman cptučně. Z prostého vzhledu lez ale dovodit, že v případěman cpse jedná skutečně o argumenty. Otázka, která tady vyvstává, je ale co to znamená[OPTION]... [-T], protože dle formátu vman manby 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- 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,-ua-n. Ostatní jsou tedy opakovatelné (vizman cp). Vman manje sekce s těmito flagy skutečně označena jakoOptions, tože vman cptomu tak není může být chyba či nedbalost. Důvod pro použití-Tv 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ě.)
- Z vysvětlení, které poskytl chatGPT ale plyne, že výrazy
- 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říkazcpvlož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říkladbaf1.txt,baf2.txt) a následně název adresáře, kam se to má kopírovat. - A konečně třetí příklad syntaxe
cp [OPTION]... -t DIRECTORY SOURCE...by pak znamenal, že za příkazcpmohu vložit možnost nebo možnosti, musím uvést možnost-ta následně mi to není jasné. Jen vím, že adresář je jeden a zdrojů může být vícero.- Tak po diskusi s AI z toho plyne, že argument
-tumož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říkazucpa 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.
- Tak po diskusi s AI z toho plyne, že argument
Syntaxe man7.org:
cp [OPTION]... [-T] SOURCE DEST
Úvahy:
- Bohužel zde, je syntaxe velmi podobná manuálu! Nicméně
cptučně by mělo znamenat, že se musí zapsat, tak jak je. To je ostatně logické. - V
man manse 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. - 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řebacp /home/juan/avidemux2, ale je otázka co by takový příkaz udělal? Když si něco takového vyzkouším, tak micphlá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říkazcp /home/juan/testje chápán jako okopíruj/home/juan/testněkam a ptá se kam. Nefunguje to ani, když je aktuálním adresářemtesta když zadám vytvořenýtest2.Z tohoto rozboru tedy plyne, že tento zápis syntaxe, není asi správný.- ChatGPT poskytl následující příkaz c
p file.txt directory/ # Copies 'file.txt' into 'directory/file.txt'. To znamená, že jsem synopsy pochopil špatně aSOURCE DESTjsou dva výrazy, ne jeden. Napřed jde zdrojový sobour (adresář), pak jde ten kam se to má uložit.
- ChatGPT poskytl následující příkaz c
- 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 souborbaf.txtdo adresářetest2.
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:
snapje název příkazu[OPTIONS]-man mannezná něco co je kapitálkama, vman manjsou options název sekce, ve které jsou možnosti či argumentyfind- je vman snapoznač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říkazfind, který má i svůj manuál a synopsy (find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]).[find-OPTIONS]- opět jako v případě bodu 2man mannezná něco s kapitálkama, stejně jako Options jsou pro něj atributy. Jinakman snapnemá sekci Options, pouze Option Commands. Man find má sekci Options a jsou tam atributy.Man snapnijak 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
snapafind). - Nemůžeme s jistotou říct, co jsou
OPTIONSa jak se chovaj, můžem pouze předkládat hypotézy:- H: Pro
snapjsouOPTIONSmožnosti v sekci Option Commands - H: Pro
findjsouOPTIONSmožnosti v sekci Options v manuálufind(proto je to označeno jakofind-OPTIONS) - H: Závorka se v příkladu nezapíše.
- H:
OPTIONSse nahradí jedním, nebo vícero jinými příkazy - H: Stejně tak
find-OPTIONSse nahradí jedním nebo víceropříkazy
- H: Pro
- Trochu matoucí je ale zápis typu
[OPTIONS] find, když víme, žefindby teoreticky mohl být součástí výrazuOPTIONS. 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ředfindmůže být jeden a více příkazů a žefindsá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 mano žádných kapitálkách nemluví, takže OPTIONS bude asi čistý výmysl tvůrcůnotify-senda 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ůrcinotify-sendsnaží sdělit. Summary značí shrnutí, jaké shrnutí tím myslí, těžko říct a jakou funkci to shrnutí má také.[body]- dleman manneví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 knotify-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 dleman unrarto vypadá, že pokud chceme využít nějaký příkaz, musíme zapsat slovocommand[-switch ...]- asi že, to nemusí obsahovat žádný argument, argumenty jsou volitelné a mohou se opakovat (výpustka)archive [file ...]- z logiky věci aman manby to mohlo znamenat, že musím zapsat slovoarchivea následně název jednoho, nebo více souborů typu rar. Nicméně z popisu vman unrarnení 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. Podleman unrarto 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é. Dleman unrarasi 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í
commandsaoptionsvman unrar.Man mans žá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
- ↑ Bash Reference Manual. www.gnu.org [online]. [cit. 2023-04-18]. Dostupné online.
- ↑ Bash Reference Manual. www.gnu.org [online]. [cit. 2023-04-18]. Dostupné online.
- ↑ Using case statements. tldp.org [online]. [cit. 2023-04-18]. Dostupné online.
- ↑ case Man Page - Linux - SS64.com. ss64.com [online]. [cit. 2023-04-18]. Dostupné online.
- ↑ bash - Console doesn't render according to man manual. Unix & Linux Stack Exchange [online]. [cit. 2023-03-28]. Dostupné online. (anglicky)