Cvičení: 1, 2, 3, 4, 5, 6, 7.

Na tomto cvičení se začneme učit jak ovládat náš Linuxový stroj tím nejefektivnějším způsobem – skrze rozhraní příkazové řádky.

Cvičení uvedeme motivací, proč bychom se vůbec měli zajímat o rozhraní příkazového řádku. Poté si krátce shrneme, co je to jméno souboru a cesta k souboru, a budeme pokračovat stručným vysvětlením hierarchie souborového systému Linux.

Po tomto teoretickém úvodu se vrhneme na používání terminálu. Naučíte se procházet adresáře a zobrazovat obsah souborů v terminálu.

Předstartovní kontrola

Prosím, ujistěte se, že následující máte hotové.

Budeme to potřebovat po zbytek semestru.

  • Můžete se přihlásit do MFF GitLabu.
  • Máte přístup k projektu Forum.
  • Zapnuli jste si upozornění z projektu Forum.
  • Máte přístup k projektu student-LOGIN a můžete v něm měnit soubory.
  • Můžete se přihlásit na školní počítače v učebnách.
  • Vybrali jste si hezké Linuxové GUI (DE/WM). Jak na školním počítači, tak na své instalaci doma.

Proč bychom vůbec měli chtít používat příkazovou řádku

Především, je to přesné a jednoznačné. Vyhneme se riziku, že by uživatel používal třeba jiný styl nebo panel nástrojů, když budeme popisovat provedení nějaké činnosti. Použití přesného příkazu nenechává snižuje prostor pro omyly.

Navíc, je to poměrně rychlé. Jakmile začneme porovnávat rychlosti klikání na ikony a rychlost klávesnice, klávesnice bude vždy vítěz (pokud předpokládáme, že v obou případech víme, co chceme vlastně udělat).

S tím částečně také souvisí to, že napsané příkazy je snadné uložit a kdykoliv znovu použít.

Takové textové soubory se nazývají skripty v Linuxovém světě. Může to být jen seznam příkazů, které se mají spustit, ale můžeme do nich přidat i cykly a podmínky pro složitější akce. Budeme se tomu věnovat po několik cvičení.

Z pohledu počítače je to také velmi efektivní. Obzvlášť, pokud budeme mluvit o vzdáleném přístupu na nestabilním připojení. Rozdíl mezi sdílením obrazovky – byť jen 800x600 – a posíláním seznamu stisknutých kláves je obrovský. Správa Linuxových serverů po ubohém 2G připojení je možná; správa serveru, který umí jen GUI s takovým připojením vůbec nepřipadá v úvahu.

Nevýhodou pak je, že vyzkoušení si takového systému je trochu složitější. V graficky orientovaném programu můžete zkoušet klikat na různé ikony a zjistit, co se děje. Na příkazovém řádku se musíte naučit spousty příkazů, abyste mohli systém používat efektivně. Nicméně, není nutné si pamatovat každý jednotlivý příkaz, protože existuje zabudovaná dokumentace, která je vždy dostupná (ještě se k tomu vrátíme).

Ve skutečnosti je to jako s libovolným programovacím jazykem: musíte znát jeho API než v něm začnete psát programy. Jen v Linuxu netvoří API funkce jak je znáte z programovacích jazyků, ale celé programy.

Faktem zůstává, že shell, který budeme používat, vznikl cca před 50 lety. Ale pořád se používá. Možná to znamená, že nedokážeme přijít s ničím novým. Ale spíše to znamená, že ty výhody skutečně dávají smysl.

Počátky mohou být složité, ale dlouhodobě se to vážně vyplatí.

Z praktického hlediska je používání příkazové řádky poměrně podobné práci v interaktivní režimu Pythonu. Píšete příkazy, můžete je upravovat a když jste spokojeni, vykonáte příkaz stiskem klávesy <Enter>.

Od této chvíle bude naše interakce se systémem vypadat většinou takto.

Nemějte však strach. Linux často vyměňuje líbivost za efektivitu. Zkuste k němu přistupovat spíše jako k novému programovacímu jazyku: nejdříve se musíte naučit (a také si zapamatovat!) něco málo o konstrukcích a standardní knihovně, než začnete psát velké programy. V Linuxu je to stejné. A rozhodně to stojí za to, pokud to s počítači myslíte doopravdy vážně. Myslíme to vážně. Doopravdy.

Názvy souborů a cesty

Tohle všechno asi pravděpodobně znáte. Klidně tuto část prolétněte. Důležité části jsme už pro vás zvýraznili.

Základní pojmy

V našem textu budeme používat název soubor k označení obyčejného názvu bez adresáře. Názvy souborů je to, co uvidíte ve vašem správci souborů nebo v e-mailu s přílohami.

Všimněte si, že na Linuxu spíše používáme slovo adresář než složka. Složkou obvykle myslíme něco virtuálního, co nemá přímou reprezentaci na souborovém systému (tj. nenajdeme to jako takové na disku). Takže můžeme mluvit o složkách v e-mailovém klientu nebo v cloudovém úložišti.

Cesta pak znamená název souboru s uvedením nějakého adresáře (před názvem souboru).

Na Linux je oddělovačem v cestě dopředné lomítko / (tj. žádné escapování není potřeba, když ji zapisujete v Pythonu), takže cestou může být třeba adresar/soubor.txt.

Linux nezná koncept diskových jednotek – všechny najdeme pod tzv. kořenovým adresářem (často se setkáte jen s anglickým označeném root), což je jediné dopředné lomítko /.

Při vytváření cest v jazyce Python byste měli raději používat funkce os.path.join() a podobné, protože zajišťují použití správného oddělovače bez ohledu na aktuální platformu (místo ručního řetězení jmeno_adresare + '/' + nazev_souboru jako text). Pozor, že se jedná o něco jiného než operator z pathlib.
Názvy souborů na Linuxu rozlišují velikost písmen. Takže je možné mít soubory foo.txt, FOO.txt a Foo.txt v jediném adresáři. (To že něco jde neznamená, že je to dobrý nápad. Naopak. Prostě to nedělejte.)

Relativní a absolutní cesta, pracovní adresář

Cesta může být relativní nebo absolutní. Když je cesta absolutní, odkazuje se na konkrétní soubor na daném počítači. Bez ohledu na to, ve kterém adresáři se právě nacházíte. Relativní cestu je potřeba vždy zkombinovat s (absolutní) cestou k adresáři, abychom získali absolutní cestu.

Na Linuxu, každá absolutní cesta musí začínat lomítkem. Pokud cesta lomítkem nezačíná, je brána jako relativní vůči pracovnímu (současnému) adresáři. Intuitivně, pracovní adresář je ten adresář, který máte právě otevřený ve správci souborů.

Speciální adresáře

Cesta může obsahovat odkazy na rodičovské (nadřazené) adresáře pomocí .. (dvě tečky). Například, relativní cesta ../documents/letter.odt odkazuje na soubor umístěný v adresáři documents, který je o adresáře výše vůči současnému. Předpokládejme, že jsme v adresáři /home/intro/movies (což je mimochodem absolutní cesta). Pak absolutní cesta k souboru letter.odt je /home/intro/movies/../documents/letter.odt což může být výhodnoceno (zkráceno) jako /home/intro/documents/letter.odt.

Kromě speciálního adresáře .. existuje ještě adresář . (jedna tečka), který odkazuje na ten současný. Takže ./bin/run_tests.sh odkazuje na soubor run_tests.sh v adresáři bin, který je podadresářem toho současného (tj. je to úplně stejné jako bin/run_tests.sh). Později uvidíme, proč je adresář . tak zajímavý a nutný.

Přípony souborů

Linux nevyžaduje ani neomezuje použití přípon u souborů (např. .zip nebo .pdf). Dokonce, soubory mohou existovat bez nich nebo jich mít několik. Typickým příkladem více-připonového souboru je soubor.tar.gz, což je tzv. tape archive tar (podle magnetických pásek), který byl komprimován gzipem.

Ve skutečnosti je tohle poměrně typický příklad rozdělení odpovědností na Linuxovém systému. Existuje zvláštní program, který je schopen vytvořit archiv (tj. jeden soubor) z mnoha. A také existuje další program, který umí zkomprimovat právě jeden soubor. Uživatel může klidně zabalit/rozbalit takový soubor jedním příkazem, ale programy mohou být vyvíjeny nezávisle na sobě. A z praktického hlediska je možné gzip nahradit jiným algoritmem aniž by bylo nutné měnit vlastní archivátor.

Skryté soubory

Soubory začínající na . jsou ve výchozím zobrazení skryté.

Je důležité si zapamatovat, že tečkové soubory jsou úplně normální soubory (adresáře) a jde pouze o konvenci tyto soubory nezobrazovat. Nejde o bezpečnostní prvek. Jen to umožní udržovat seznam souborů o něco kratší.
Obvykle jsou konfigurační soubory (např. tapeta na ploše) uložené jako tečkové soubory, protože se neočekává, že by s nimi uživatel přímo pracoval (alespoň většinu času). Takže by jen zabíraly místo ve výpisu.

Vše na Linuxu je soubor

Naše povídání jsme začali o souborech a cestách. Důvodem je, že téměř cokoliv v Linuxovém systému je soubor.

Už víte, že existují obyčejné soubory (např. zmiňovaný letter.odt je soubor textového procesoru) a adresáře (pro seskupování dalších souborů).

Uvědomte si, že slovo soubor může v Linuxu označovat jak běžné soubory, tak i adresáře, tj. adresář je soubor.

Kromě toho také existují speciální soubory, které reprezentují fyzická zařízení nebo soubory, které fungují jako kukátka do stavu systému. Na ty se podíváme později.

Zkontrolujte si, zda této části rozumíte

Vyberte všechna pravdivá tvrzení.

You need to have enabled JavaScript for the quiz to work.

Spusťte vaše terminály, prosím

Dost bylo teorie. Najděte prosím program Terminal a spusťte jej. V závislosti na vašem prostředí to bude buď Terminál, Konzole, nebo možná dokonce Shell (i když technicky vzato je Shell program spuštěný uvnitř emulátoru terminálu).

Doporučujeme věnovat nějaký čas konfiguraci vzhledu terminálu, například zvolit pěkný font a rozumnou velikost. Budete s ním trávit poměrně hodně času, tak si ho zpříjemněte. Níže uvádíme několik možností, co byste mohli také získat :-).

Zobrazí se něco jako [intro@localhost ~] a poté blikající kurzor. Tomu se říká prompt, a pokud ho vidíte, znamená to, že můžete zadávat příkazy.

Výzvu zobrazuje shell, který je interpretem zadávaných příkazů. Shell je vlastně plnohodnotný programovací jazyk, ale na tomto cvičení ho budeme používat pouze ke spouštění velmi jednoduchých příkazů.

Zadejte uptime a spusťte tento příkaz stisknutím <Enter>. Dokud nestisknete <Enter>, můžete příkaz snadno upravovat. Fungují také klávesové zkratky, například <Ctrl>-<Šipka> pro přeskakování slov.

Jak jsme již zmínili, zážitek je do jisté míry podobný interaktivnímu použití Pythonu (editace atd.).

Rychlé kopírování/vkládání (a ukončování programů)

Kdykoli vyberete text v terminálu myší, automaticky se zkopíruje. Tento text pak můžete vložit pouhým kliknutím na prostřední tlačítko myši (nebo kolečko).

Všimněte si, že známé kombinace <Ctrl>-C a <Ctrl>-V v shellu nefungují protože <Ctrl>-C se používá k násilnému ukončení programu. Obvykle však funguje <Ctrl>-<Shift>-C.

Všimněte si, že se ve skutečnosti jedná o dvě různé schránky - speciální vázaná na na prostřední tlačítko myši a druhá na <Ctrl>-C (<Ctrl>-<Shift>-C) a <Ctrl>-V. V grafických aplikacích fungují <Ctrl>-C a <Ctrl>-V jako obvykle.

Ukončení terminálu

Chcete-li terminál zavřít, můžete jednoduše zavřít celé okno (např. pomocí tlačítka myší), ale můžete také napsat exit nebo stisknout <Ctrl>-D na prázdném řádku. Protože se chceme zbavit nutnosti používat myš (v určitém smyslu), měli byste dát přednost <Ctrl>-D ;-).

Ladění chyb

Při spouštění programů v terminálu nikdy nevkládejte jejich výstup jako snímek obrazovky. Místo toho vyberte text (včetně spuštěného příkazu) a vložte jej tam, kam potřebujete.

Nezapomeňte, že označený text je automaticky zkopírován: prosté klepnutí prostředním tlačítkem text vloží kam potřebujete.

Od této chvíle sem také přestaneme vkládat snímky obrazovky z terminálu a budeme vkládat pouze výstup (i když byste měli vždy spustit příkaz sami, abyste viděli, co dělá a skutečně si ho vyzkoušeli sami).

Pro vložení do našeho Fórum text uzavřete do ohraničeného bloku ```, abyste zachovali písmo s pevnou šířkou.

```
ls nonexistent
ls: cannot access 'nonexistent': No such file or directory
```

Průchod systémem souborů

Začneme jednoduchým průchodem souborového systému. Pomohou vám dva základní příkazy.

Výpis souborů pomocí ls

Příkaz ls zobrazí seznam souborů v aktuálním adresáři.

Spuštěním ls získáte něco takového:

Desktop Downloads Hudba Veřejná videa
Dokumenty gif.md Obrázky Šablony

Nyní spusťte ls -l. Tedy ls a -l oddělené mezerou. Zde voláme program ls a dáváme mu další argument, -l. Protože argument začíná pomlčkou, jedná se vlastně o takzvanou volbu (nebo přepínač, anglicky pak option či switch), která dává pokyn ls, aby změnil své chování. Nyní ls vypíše něco takového:

celkem 4
drwxr-xr-x. 1 intro intro 0 10. února 13:43 Desktop
drwxr-xr-x. 1 intro intro 0 10. února 13:43 Dokumenty
drwxr-xr-x. 1 intro intro 0 10. února 13:43 Stažené soubory
-rw-r--r--. 1 intro intro 1022 9. ledna 18:13 gif.md
drwxr-xr-x. 1 intro intro 0 10. února 13:43 Hudba
drwxr-xr-x. 1 intro intro 0 10. února 13:43 Obrázky
drwxr-xr-x. 1 intro intro 0 10. února 13:43 Public
drwxr-xr-x. 1 intro intro 0 10. února 13:43 Šablony
drwxr-xr-x. 1 intro intro 0 10. února 13:43 Videa

Klávesa -l zapíná tzv. dlouhý režim (long), ve kterém se o každém souboru vypíše více podrobností.

K významu některých sloupců se vrátíme později, rozluštění sloupců pro čas poslední změny a velikost souboru je jednoduché a pro tuto chvíli dostačující.

Změna pracovního adresáře pomocí cd

Příkaz cd nám umožňuje změnit pracovní (aktuální) adresář (z anglického change directory). Příkaz přijímá jeden argument – adresář, do kterého se chceme přepnout.

Příkaz cd Documents by nás tedy přesunul do adresáře Documents.

Zde proveďte ls. Jaký je výstup? Odpověď.

Jak byste se přesunuli zpátky do nadřazeného adresáře Odpověď.

Co provede následující příkaz?

cd .
Odpověď.

Všimněte si, že prompt se změnil vždy, když jste přešli do jiného adresáře.

Ve výchozím nastavení zobrazuje pouze poslední složku cesty. Chceme-li zobrazit celou (absolutní) cestu, musíme spustit příkaz pwd (z anglického print working directory).

Zobrazí se něco jako

/home/intro/Videos

Doplňování tabulátorem

Psaní dlouhých názvů souborů může být těžkopádné a náchylné na překlepy. Shell nabízí doplňování tabulátorem (tab completion), které vám s tím pomůže.

Pro tento příklad předpokládáme, že jste právě spustili terminál a ls vypíše Desktop Documents Downloads Templates atd.

Pokud chceme přejít do adresáře Templates, začneme psát cd Te a stiskneme <Tab>. Pokud neexistuje jiný název souboru (adresáře) začínající na Te, název v příkazu se doplní za vás a měli byste vidět celé cd Templates/.

Odesláním příkazu pomocí <Enter> se přepnete do adresáře, jak byste očekávali. Vyzkoušejte to a vraťte se do tohoto adresáře znovu.

Nyní se přepneme do adresáře Documents. Pro tento příklad zadejte cd Do a stiskněte <Tab>. Existují dva adresáře s touto předponou: Documents a Downloads. Protože shell nemůže vědět, který z nich chcete, neudělá nic.

Při druhém stisknutí <Tab> se však zobrazí možné shody a po zadání c (dalšího písmene) může <Tab> dokončit doplňování.

Doplňování tabulátorem je mimořádně výkonná funkce, která ušetří stovky stisků kláves a výrazně urychlí vaši interakci se shellem. Naučte si ji používat co nejvíce: v některých případech může dokonce pomoci s doplňováním voleb (switch) (záleží na vašem prostředí).
Shelly v jiných operačních systémech také nabízejí doplňování tabulátorem, ale v mnohem méně organizované podobě.

Jako cvičení: co se stane, když napíšete cd a stisknete <Tab>? Odpověď.

Zadejte pouze c (jako cd) a stiskněte <Tab>. Co se stane? Odpověď.

Domovský adresář

Pravděpodobně jste si všimli, že když spustíte terminál, název adresáře, který se vám zobrazí, je jen ~, přestože by se mělo zobrazit intro (nebo vaše uživatelské jméno na daném počítači), protože to je poslední složka z pwd.

Cesta /home/intro je však váš domovský adresář a má speciální zkratku vlnovkou (tilda) ~.

Pokud navíc spustíte příkaz cd bez dalších argumentů, změní se pracovní adresář zpět na váš domovský.

Stručné shrnutí

Co si pamatujete? Vyberte všechna tvrzení, která jsou pravdivá.

You need to have enabled JavaScript for the quiz to work.

Nástroje s textovým uživatelským rozhraním

I když je použití nástrojů čistě pro příkazový řádek, jako jsou uptime, ls nebo cd, skvělé a pro skripty velmi užitečné, existují i případy, kdy je interaktivnější přístup rychlejší.

V tomto smyslu Linux obvykle nabízí tři vrstvy, ze kterých si můžete vybrat. Od plně grafické, nazývané grafické uživatelské rozhraní (GUI), přes nástroj s textovým uživatelským rozhraním (TUI) až po čisté rozhraní příkazového řádku (CLI). Každé z nich může být užitečné v závislosti na okolnostech.

Ve skutečnosti existuje také čtvrtá (spodní) vrstva, kde máte přímý přístup ke speciálním souborům.

Textovým uživatelským rozhraním myslíme to, co nabízí Midnight commander nebo Ranger.

Midnight commander

Spusťte mc a procházejte soubory stejně jako v případě ls a cd.

Čísla v dolní části odkazují na funkční klávesy pro typické operace se soubory (např. F5 zkopíruje soubor).

Všimněte si, že v typickém nastavení nabízí MC dva panely se seznamem souborů, mezi nimi přepínáte pomocí <Tab> a ve výchozím nastavení je kopírování do adresáře v druhém panelu.

MC je poměrně mocný nástroj, protože dokáže prozkoumávat archivy, zobrazovat soubory na vzdáleném počítači atd.

Stručně se zmíníme o nejdůležitějších věcech, které s ním můžete dělat. Vyzkoušejte je :-)

  • <Insert> umožňuje vybrat více souborů ke smazání/kopírování.
  • <F3> zobrazí obsah souboru.
  • <F4> nabízí jednoduchý textový editor se zvýrazňováním syntaxe.
  • <+> umožňuje zadat masku názvu souboru pro výběr více souborů najednou (více o tom budeme hovořit později v části Wildcards).
  • <Ctrl>-o skryje panely a dočasně vás přepne zpět do shellu. Ideální pro spouštění příkazů bez opuštění MC.

Program MC můžete ukončit pomocí <F10> nebo prostřednictvím nabídky (aktivuje se pomocí <F9>). Všimněte si, že některé terminály zachycují <F10> pro aktivaci jejich menu (toto chování však lze změnit v Nastavení (Preferences) terminálové aplikace).

Ranger

Ranger je správce souborů pro konzoli inspirovaný Vimem. Přináší některé známé klávesové zkratky z Vimu společně s kartami (panely).

Procházení

  • j - Posun dolů
  • k - Posun nahoru
  • h - Přesun do nadřazeného adresáře
  • l - Otevření souboru nebo přesun do adresáře
  • gg - Přejít na začátek seznamu
  • G - Přejít na konec seznamu
  • gh - cd ~
  • gm - cd /media
  • gr - cd /
  • q - Ukončí Ranger

Práce se soubory

  • zh - Zobrazení skrytých souborů
  • cw - Přejmenování aktuálního souboru
  • <mezerník> - Vybere aktuální soubor
  • yy - Vyjmutí (kopírování) souboru (nebo vybraných souborů)
  • dd - Označení souboru (nebo vybraných souborů) pro operaci vystřižení souboru
  • pp - Vložit vyjmutý nebo vystřižený soubor(y)
  • dD - Odstranění souboru (nebo vybraných souborů)

Více informací naleznete na stránce Ranger: Terminálový správce souborů (v angličtině).

Úpravy souborů

Pravděpodobně jste si všimli, že podnabídka Vývoj obsahuje několik grafických textových editorů, které můžete použít k úpravě zdrojového kódu. Soubory je však možné upravovat také v editorech TUI.

Pokud se ptáte, proč se učit další editor (když vám již vyhovuje některý z grafických), zde je odpověď. Na některých počítačích nemusíte mít ke grafickému rozhraní vůbec přístup. Vzpomeňte si, že jsme dříve hovořili o vzdáleném přístupu: v takovém případě budete mít k dispozici pouze TUI (a často budete potřebovat upravovat soubory na vzdáleném počítači). Někteří uživatelé tedy vůbec nepoužívají editory s grafickým uživatelským rozhraním s odůvodněním, že je mnohem lepší naučit se (a řádně přizpůsobit) jeden editor, a to editor založený na TUI.

Na našem disku najdete Emacs, Joe, mcedit, nano a Vim.

Každý z nich má své výhody a záleží jen na vás, který si vyberete. Všimněte si, že mcedit je pravděpodobně nejblíže editoru, který můžete znát z jiných systémů. joe a nano jsou sice minimalistické, ale dokonale se hodí pro editaci skriptů, kterou budeme provádět nejčastěji. Jak emacs, tak vim jsou nesmírně výkonné nástroje, které toho umí mnohem víc než jen upravovat soubory. Vyžadují však určitou časovou investici, než se s nimi pořádně naučíte.

Pokud jste v Linuxu nováčkem, doporučujeme vám používat mcedit (buď přímo, nebo při editaci souborů v Midnight commanderu) a k ostatním se vrátit později, abyste se mohli definitivně rozhodnout, který textový editor si vyberete.

Všechny tyto editory lze spustit z příkazového řádku a jako parametr jim zadat název souboru, který chcete upravit (např. mcedit quiz.md).

V mnoha případech (včetně některých hodnocených úloh v tomto kurzu) budete nuceni upravovat soubory na vzdáleném počítači, který nabízí pouze rozhraní CLI (TUI).

Naučte se brzy používat nějaký TUI editor, budeme ho potřebovat v následných cvičeních.

Některé z výše zmíněných editorů nabízejí i grafickou verzi a jsou multiplatformní, takže se nemáte na co vymlouvat, že nechcete vyzkoušet něco nového :-)

Příprava souborů pro cvičení

Pro následující příklady budete potřebovat stejné soubory jako máme my.

Stáhněte si prosím tento archiv a rozbalte jeho obsah. Pokud jej chcete stáhnout z příkazového řádku, můžete použít wget URL, jinak použijte libovolný prohlížeč. Pomocí Midnight commanderu zkopírujte rozbalený obsah do svého domovského adresáře. Nápověda.

Na disku byste měli vidět adresář nswi177-lab02.

Zástupné znaky v shellu (wildcards)

Předpokládáme, že máte adresář nswi177-lab02 připravený podle popisu v předchozí části.

Dosud jsme používali ls k zobrazení všech souborů v adresáři. Pokud nás zajímá pouze jejich podmnožina, můžeme je na příkazovém řádku vyjmenovat.

Přesuňte se do adresáře, kam jste rozbalili soubor nswi177-lab02.tar.gz. Měli byste vidět následující soubory:

a/ b/ c/ one.txt two.txt three.txt four.txt

Pokud chceme vypsat pouze podrobnosti o textových souborech, můžeme provést

ls -l one.txt two.txt three.txt four.txt
-rw-r--r-- 1 intro intro 0 3. března 13:38 four.txt
-rw-r--r-- 1 intro intro 0 3. března 13:38 one.txt
-rw-r--r-- 1 intro intro 0 3. března 13:38 tři.txt
-rw-r--r-- 1 intro intro 0 3. března 13:38 dva.txt

Pro více souborů by tohle nebylo příliš elegantní řešení, ale shell nabízí tzv. wildcards (občas též zástupné znaky) pro určení více souborů najednou. Stejný výstup lze tedy získat spuštěním příkazu

ls -l *.txt

Je nutné si uvědomit, že ls (nebo jakýkoli jiný program) obdrží už expandovaný seznam souborů - vyhledávání odpovídajících souborů provádí shell, nikoli jednotlivé programy. V případě výše uvedeného příkladu tedy zevnitř ls není možné rozlišit, zda uživatel použil úplný seznam nebo wildcard *.txt. Experimentovat s tím budeme také v jednom z příštích cvičení, kde si povíme o přístupu k těmto parametrům ve vašem oblíbeném programovacím jazyce. Pro vývojáře to znamená, že se nemusí starat o vlastní implementaci expanze wildcardů. Program by vždy obdržel seznam existujících názvů souborů, nikoliv wildcard.

Mimochodem - je poslední věta zcela pravdivá? Co se stane, když spustíme ls -l *.txxxt? Odpověď.

Jak byste vytiskli všechny soubory začínající písmenem t? Odpověď.

Pokud bychom chtěli vypsat pouze informace o souborech začínajících na o nebo f s příponou .txt, použili bychom.

ls [of]*.txt

Pokud chceme vypsat soubory, které končí na některé z písmen od a do f, můžeme použít následující příkaz

ls *[a-f].txt

Zkuste to v podadresáři a.

Všimněte si, že při zadávání pomocí wildcardů jsou soubory řazeny abecedně.

Přepněte se zpět do domovského adresáře. Nápověda.

A nyní vypište všechny soubory/adresáře začínající na D (připomeňme si, že Linux rozlišuje malá a velká písmena). Možná budete překvapeni, protože prosté ls D* skutečně vypsalo obsah těchto adresářů. Je to ale naprosto logické, protože ls Documents má vypsat seznam souborů v tomto adresáři. Pokud nechceme, aby ls sestupoval do adresářů, můžeme přidat volbu -d, která tomu zabrání.

Co se stane, když zadáte neexistující soubor? A co když neexistují jen některé ze zadaných souborů?

Kromě * (který odpovídá libovolné části názvu souboru) a [seznamu znaků] (který odpovídá jednomu písmenu v názvu souboru) existuje také ?, který odpovídá libovolnému jednotlivému písmenu (znaku).

Proto x?.txt bude odpovídat souborům, jejichž název je dlouhý 6 písmen (znaků), začíná na x a končí na .txt (tj. dvoupísmenný název souboru začínající na x a typu prostý text).

Více o skrytých souborech

Připomeňme si, že názvy souborů začínající tečkou . jsou skryté. Ty nejsou ve výchozím nastavení v seznamu od programu ls uvedeny. Pokud chcete vidět i tyto soubory, musíte je buď explicitně vyjmenovat, nebo použít volbu -a.

Zkuste to v adresáři nswi177-lab02.

Jaké skryté soubory jsou ve vašem domovském adresáři? Odpověď.

Opět: nejedná se o bezpečnostní opatření, pouze o způsob, jak udělat výpis trochu přehlednější.

Zkoumáme obsah souborů

Již jsme se zmínili o textových editorech a MC pro nahlížení do souborů při práci v terminálu. Nejsou to však jediné možnosti.

Textové soubory

Nejjednodušší způsob, jak vypsat obsah libovolného souboru, je zavolat program cat. Jeho argumenty jsou jména souborů, které se mají vypsat. Název cat nemá nic společného se savcem, ale odkazuje na střed slova concatenate, protože jej lze skutečně použít i ke spojování souborů.

Přesuňte se do podadresáře b. Spuštěním příkazu cat 000.txt se na obrazovce zobrazí obsah souboru 000.txt.

Jak zobrazíte obsah všech souborů v tomto adresáři? Odpověď.

Binární soubory

Pokud chceme vypisovat binární soubory (například obrázky), je obvykle lepší vypisovat jejich bajty v hexadecimálním tvaru.

K tomu lze použít nástroj hexdump.

Vždy jej použijte s přepínačem -C pro vypsání hexdump a ASCII znaků vedle sebe. Výpis souboru GIF vypadá takto:

hexdump -C c/sample.gif
00000000  47 49 46 38 39 61 0a 00  0a 00 91 00 00 ff ff ff  |GIF89a..........|
00000010  ff 00 00 00 00 ff 00 00  00 21 f9 04 00 00 00 00  |.........!......|
00000020  00 2c 00 00 00 00 0a 00  0a 00 00 02 16 8c 2d 99  |.,............-.|
00000030  87 2a 1c dc 33 a0 02 75  ec 95 fa a8 de 60 8c 04  |.*..3..u.....`..|
00000040  91 4c 01 00 3b                                    |.L..;|
00000045

Netisknutelné hodnoty (např. menší než 32) jsou nahrazeny tečkou.

Všimněte si, že první znaky jsou normální písmena ASCII (což bylo chytré rozhodnutí autorů formátu souboru).

Hádání typu souboru

Přestože přípona souboru není povinná, je lepší ji používat k jednoznačné identifikaci typů souborů.

Pokud si nejste jisti typem souboru, může ho za vás určit nástroj file.

Zkuste ho spustit na ukázkovém souboru GIF.

file c/sample.gif

Dokumentace (manual pages)

Viděli jsme, že chování ls lze upravit pomocí -a, -d a -l. hexdump-C. Víte, že uptime akceptuje -s? A že cat přijímá -n pro vypisování čísel řádků?

Je prakticky nemožné si to všechno zapamatovat. Naštěstí Linux obsahuje takzvané manuálové stránky (nebo jen manpages), které popisují dostupné možnosti (téměř) každého programu, který máte v systému.

Spuštěním příkazu man cmd získáte přístup k příručce k programu cmd (skutečný název příkazu nahraďte místo cmd). Pro posouvání použijte šipky a q pro ukončení příručky. Uvnitř stránky můžete vyhledávat pomocí klávesy / (lomítko).

Manuálové stránky jsou uspořádány do sekcí a číslo sekce můžete zadat jako součást příkazu man, např. man 3 printf otevře stránku nápovědy pro funkci printf() v jazyce C, protože to je obsah sekce 3. Všimněte si, že man printf by zobrazil obsah nápovědy příkazu printf ze sekce 1, tj. příkaz shellu.

Otevřete man man a zobrazte úplný seznam sekcí. Ve stručnosti, 1 je pro příkazy shellu, 3 pro volání knihoven a 4 a 5 se používají pro konkrétní soubory (např. man 5 proc spustí manuálovou stránku pro celý adresář /proc).

Všimněte si, že manuálové stránky jsou k dispozici také on-line, takže můžete studovat své oblíbené příkazy i bez přístupu k počítači s Linuxem.

Obvyklé volby

Mnohé z parametrů jsou více či méně standardizované pro více programů a stojí za to si je zapamatovat.

Téměř všechny programy GNU, které budete mít na svém počítači, vypíší při spuštění pomocí --help malou nápovědu. Vyzkoušejte to pro ls nebo cd.

--version lze použít k vypsání informací o verzi a autorských právech spuštěného programu. Někdy funguje také -v nebo -V.

--verbose nebo --debug (někdy -v nebo -d) spustí program ve upovídaném (verbose) režimu, kdy program vypisuje podrobněji, co dělá.

--dry-run (někdy -n) spustí program, aniž by provedl skutečné změny (např. může vypsat, které soubory budou odstraněny, aniž by některý z nich skutečně odstranil).

--interactive (někdy -i) obvykle způsobí, že program požádá o interaktivní potvrzení destruktivních akcí.

-- lze použít k ukončení seznamu možností, pokud máte názvy souborů začínající pomlčkou. Pro klasický příklad se přesuňte do podadresáře d adresáře nswi177-lab02 a vypište informace o souboru s názvem -a. Poté zkontrolujte výsledek a zkuste to znovu s použitím oddělovače --. Odpověď.

Při práci s neznámými soubory nepodceňujte použití --. Může se jednat o nevinný omyl, když se objeví soubor s názvem -f, ale výsledky bez použití -- v cmd WILDCARD mohou být obrovské.

Vždy použijte cmd -- WILDCARD, pokud zástupný znak začíná znakem * nebo pokud zástupný znak pochází potenciálně od uživatele (tj. také pokud uživatel zadá seznam souborů na příkazovém řádku).

Slučování a řazení voleb a přepínačů

Příkaz ls -h -l *.txt vypíše podrobné informace o všech textových souborech v aktuálním adresáři a vypíše jejich velikost v lidsky čitelných jednotkách (ano, bohužel ls je výjimkou, kdy -h nevypisuje nápovědu, ale mění výstup -l).

Občas se můžete setkat i s následujícími variantami výše uvedeného.

ls -l -h *.txt
ls -lh *.txt
ls -hl *.txt
ls *.txt -l -h
ls -l *.txt -h

Pokud nemáte nějaký podivně pojmenovaný soubor (např. -a.txt), budou všechny výše uvedené příkazy fungovat stejně.

Varianta -lh je zkratka, kterou podporuje mnoho nástrojů pro jakousi úsporu. Doporučujeme se jí vyhnout, protože čtení skriptů spíše komplikuje.

Variantu, kdy jsou volby smíchány s názvy souborů, tedy např. ls -l *.txt -h, podporuje také většina nástrojů: budou schopny oddělit volby od názvů souborů a brát -h za přepínač místo názvu souboru a rozumně tak změnit pořadí příkazového řádku.

Příkazy však obvykle očekávají, že jména souborů budou na konci: nejbezpečnější variantou je proto použití následujícího způsobu.

ls -l -h -- *.txt

Výše uvedená forma (tj. nejprve volby) bude fungovat pro většinu nástrojů (a použití explicitního oddělovače -- je defenzivní přístup proti divným názvům souborů).

Pozor, že záleží na programu a nikoliv na shellu jak bude pracovat s argumenty. Později si ukážeme programy, kde na pořadí přepínačů záleží a ovlivňuje to jak se program chová.

Zádrhele (soubory s mezerou v názvu)

Pokud vytvoříte soubor s názvem soubor s mezerami.txt a poté spustíte příkaz

ls soubor s mezerami.txt

obdržíte

ls: cannot access 'soubor': No such file or directory
ls: cannot access 's': No such file or directory
ls: cannot access 'mezerami.txt': No such file or directory

protože mezera (nebo tabulátor) se používá jako oddělovač mezi parametry. Proto ls ve skutečnosti hledal tři soubory.

Pokud byste použili doplňování tabulátorem, příkaz by byl doplněn escape znaky.

ls soubor\ s\ mezerami.txt

Všimněte si, že výstup by obvykle vypadal takto:

'soubor s mezerami.txt'

protože použití apostrofů (nebo uvozovek) je další způsob, jak určit, že mezera je doslovný znak, a ne oddělovač.

Ještě se o tom zmíníme, až budeme mluvit o skriptech, ale je vhodné si to zapamatovat: mezery v názvech souborů mohou způsobit nečekaná překvapení a je lepší se takovému pojmenování vyhnout.

A ano, je možné vytvořit soubor s názvem ' ' (tj. mezera) a zobrazit jeho obsah pomocí cat " ", ale není to příliš rozumný nápad. Je to podobné jako s vytvářením souborů začínajících pomlčkou – je to možné, existují způsoby, jak tyto problémy obejít (např. pomocí oddělovače --), ale je prostě jednodušší se těmto problémům vyhnout.

Jak pracovat efektivněji

Nebojte se spouštět více terminálů vedle sebe. Jeden používejte k navigaci pomocí ls a cd, druhý používejte pro Midnight commander, který bude zrcadlit vaše akce.

Otevřete další terminál s manuálovou stránku pro příkaz, který právě používáte.

Většina desktopových prostředí umožňuje vytvořit více pracovních prostorů (workspace) nebo desktopů. Každá pracovní plocha pak má svůj vlastní seznam otevřených oken, okna otevřená na jiných pracovních plochách nejsou viditelná. To může výrazně snížit nepořádek a – s vhodnými klávesovými zkratkami – urychlit práci.

Spouštění Pythoních skriptů z příkazové řádky

O tomhle si budeme více povídat na dalším cvičení, prozatím můžete použít následující příkaz abyste spustili váš Pythoní program:

python3 cesta_k_vasemu_python_skriptu.py

Úlohy k ověření vašich znalostí

Očekáváme, že následující úlohy vyřešíte ještě před příchodem na cvičení, takže se budeme moci o vašich řešeních na cvičení pobavit.

Vyberte z níže uvedených možností tu, která nejlépe vystihuje účel následujícího fragmentu kódu Pythonu.

Jde nám o co nejlepší (tj. nejpřesnější) odpověď: jistě je pravdivá odpověď je to kód Pythonu, který něco vypíše, ale o to nám nejde :-)

stats = {}
with open('/proc/meminfo', 'r') as f:
    for line in f:
        parts = line.split(":")
        stats[parts[0].strip()] = parts[1].split()[0].strip()
print(float(stats['MemFree'])/float(stats['MemTotal']))
  1. Vypíše data prvních dvou řádků ze souboru /proc/meminfo.
  2. Vypíše druhý sloupec souboru /proc/meminfo, kde jsou sloupce odděleny dvojtečkami (:).
  3. Vytiskne odhad volného množství paměti v procentech.
  4. Zkontroluje, že /proc/meminfo obsahuje platná data.
  5. Přečte /proc/meminfo a ověří, jestli je ve správném formátu.

Zjistěte, jak používat příkaz stat, aby vypsal název souboru následovaný jeho velikostí.

Jak jste asi uhodli, podívejte se na manuálovou stránku stat, kde najdete správné možnosti. Kromě názvu a velikosti souboru nevypisujte žádné další informace.

Následující úloha je kontrolována GitLabem. Pokud ji zkopírujete do souboru 02/wildcards.md, automatické testy by vám měly říci, zda je vaše řešení v pořádku nebo ne.

Stáhněte si nejdřív tento archiv:

https://d3s.mff.cuni.cz/f/teaching/nswi177/202324/labs/nswi177-lab02-wildcards.tar.gz

Nyní se podívejte na takové soubory v podadresáři `login`, které začínají desítkovou
číslicí, končí `z.txt` a prostřední písmeno je libovolné písmeno (tj. A-Z, nikoliv
čísla) z vašeho přihlašovacího jména na GitLab (malými písmeny).

Na příklad, pro login `johndoe` byste měli pracovat se soubory
`0jz.txt`, `1ez.txt` ale ne s `ajz.txt` nebo `2wz.txt` nebo
`0jx.txt`.

Seznam souborů setřiďte abecedně, opakovaná písmena nezahrnujte
(tj. použijte rozumně wildcardy a bude to rovnou fungovat).

**Q1** Vložte sem obsah těchto souborů
(nevkládejte žádné extra znaky jako znaky nového řádku apod.).
Vložte vaši odpověď mezi značky níže, namísto tří teček.
Úvodní a koncové mezery v odpovědi budou ignorovány, ale
ponechte ohvězdičkované A1 značky beze změn (to vám zkontrolují i testy).

**[A1]** ... **[/A1]**


**Q2** Vložte sem wildcard, který jste použili
(jen vlastní wildcard bez `ls` nebo jakéhokoliv dalšího příkazu, který jste použili).

**[A2]** ... **[/A2]**

**Q3** Vložte sem celý příkaz (včetně `ls`), který vytiskne
soubory v adresáři `letters`, které končí písmenem `o`.
Předpokládejte, že `ls` spouštíte v adresáři `letters`
a **použijte správné wildcardy**.

**[A3]** ... **[/A3]**

Tento příklad vám může zkontrolovat GitLab skrz automatizované testy. Uložte vaše řešení jako 02/wildcards.md a commitněte ho (pushněte) do GitLabu.

Připravte skript (tj. příkaz uložte do souboru), který vytiskne architekturu vašeho počítače (pro většinu z vás to bude x86_64).

Nápověda: podívejte se na příkaz uname.

Tento příklad vám může zkontrolovat GitLab skrz automatizované testy. Uložte vaše řešení jako 02/architecture.sh a commitněte ho (pushněte) do GitLabu.

Zkraťte následující cestu tak, aby neobsahovala žádné relativní odkazy (tj. převeďte ji na absolutní cestu bez .. a .).

/home/../usr/./share/./man/../../lib/../../etc/ssh/.././os-release

Tento příklad vám může zkontrolovat GitLab skrz automatizované testy. Uložte vaše řešení jako 02/path.txt a commitněte ho (pushněte) do GitLabu.

Učební výstupy

Učební výstupy podávají zhuštěný souhrn základních konceptů a dovedností, které byste měli umět vysvětlit a/nebo použít po každém cvičení. Také obsahují absolutní minimum, které je potřebné pro pochopení navazujících cvičení (a dalších předmětů).

Znalosti konceptů

Znalost konceptů znamená, že rozumíte významu a kontextu daného tématu a jste schopni témata zasadit do většího rámce. Takže, jste schopni …

  • vysvětlit, kdy je rozhraní příkazového řádku lepší (či horší) volbou než grafická aplikace

  • vysvětlit rozdíl mezi (emulátorem) terminálu a shellem

  • vysvětlit, co je to cesta k souboru

  • vysvětlit rozdíl mezi relativní a absolutní cestou

  • vysvětlit, jak fungují tzv. shell wildcards (názvy souborů)

  • vysvětlit, co jsou argumenty příkazové řádky (options, switches)

  • vysvětlit užitečnost oddělovače -- (při použití wildcardů u zvláštně pojmenovaných souborů)

Praktické dovednosti

Praktické dovednosti se obvykle týkají použití daných programů pro vyřešení různých úloh. Takže, dokážete …

  • spustit a ukončit emulátor terminálu

  • nastavit si oblíbený emulátor terminálu

  • procházet souborový systém pomocí nástrojů textového uživatelského rozhraní (např. mc nebo ranger)

  • procházet souborový systém pomocí příkazů ls a cd

  • použit základní přepínače příkazu ls, jako jsou -l, -h nebo -a

  • použít zástupné znaky (wildcards) pro omezení příkazů na určité podmnožiny souborů

  • spustit Pythoní skript z příkazové řádky

  • zobrazit obsah textových soubor pomocí utility cat

  • zobrazit obsah binárních souborů jako hexadecimální výpis pomocí programu hexdump

  • identifikovat typ souboru pomocí nástroje file

  • využívat vestavěné manuálové stránky (základní operace)

  • používat schránky dostupné v grafických prostředích Linuxu

  • používat doplňování tabelátorem pro rychlejší psaní názvů souborů a cest

  • používat soubory se neobvyklými názvy