Bash pro začátečníky/Terminál, manuál a Bash
Tato stránka je součástí kurzu: | |
začátečníci | |
Příslušnost: všeobecná |
Terminál, manuál a Bash
editovatVysvětlení manuálové syntaxe
editovatV 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)
editovatSyntaxe: 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á jakocase
obrá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říkazucase
není 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 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, jestliPATTERN
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 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,PATTERN
je1
, závorka)
se zapíše,COMMANDS
odpovídá příkazuecho
, respetiveecho "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 aPATTERN
ano? Logická odpověď je, žein
není 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 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)
editovatSyntaxe man:
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
Příklad:
Úvahy:
cp
je zkratka příkazu, tedy copy- Podle
man man
kapitálky nic neoznačují, respetiveman 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í. - 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! - 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álucp
je, že neobsahuje sekci Options, hned by bylo jasné, co[OPTION]
může znamenat. Man man
píše, že něco jako[-T]
znamená, že jsou argumenty volitelné. Žel bohu se opětman man
aman cp
liší v tom, že vman man
jsou argumenty na rozdíl odman 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 vman 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- 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é (vizman cp
). Vman man
je sekce s těmito flagy skutečně označena jakoOptions
, tože vman 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ě.)
- 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říkazcp
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ří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říkazcp
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.- 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říkazucp
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.
- 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ě
cp
tučně by mělo znamenat, že se musí zapsat, tak jak je. To je ostatně logické. - 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. - 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 micp
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říkazcp /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ářemtest
a 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 DEST
jsou 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.txt
do 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)
editovatSyntaxe man: snap [OPTIONS] find [find-OPTIONS]
Úvahy:
snap
je název příkazu[OPTIONS]
-man man
nezná něco co je kapitálkama, vman man
jsou options název sekce, ve které jsou možnosti či argumentyfind
- je vman 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ří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 man
nezná něco s kapitálkama, stejně jako Options jsou pro něj atributy. Jinakman 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
afind
). - Nemůžeme s jistotou říct, co jsou
OPTIONS
a jak se chovaj, můžem pouze předkládat hypotézy:- H: Pro
snap
jsouOPTIONS
možnosti v sekci Option Commands - H: Pro
find
jsouOPTIONS
možnosti v sekci Options v manuálufind
(proto je to označeno jakofind-OPTIONS
) - H: Závorka se v příkladu nezapíše.
- H:
OPTIONS
se nahradí jedním, nebo vícero jinými příkazy - H: Stejně tak
find-OPTIONS
se nahradí jedním nebo víceropříkazy
- H: Pro
- Trochu matoucí je ale zápis typu
[OPTIONS] find
, když víme, žefind
by 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ředfind
může být jeden a více příkazů a žefind
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)
editovatSyntaxe 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ůrcinotify-send
snaží sdělit. Summary značí shrnutí, jaké shrnutí tím myslí, těžko říct a jakou funkci to shrnutí má také.[body]
- dleman 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 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)
editovatSyntaxe 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)
editovatSyntaxe 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 unrar
to 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 man
by to mohlo znamenat, že musím zapsat slovoarchive
a následně název jednoho, nebo více souborů typu rar. Nicméně z popisu vman 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. Podleman 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é. Dleman 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
aoptions
vman unrar
.Man man
s žádnou sekcí commands nepočítá.
Struktura manuálu a Bashe
editovatTato 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
editovatPř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
editovatCí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
editovatTAB
– 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)