Unixové systémy – cvičení

Cvičení 1


První cvičení probíhá ještě v MS Windows, na učebně nebo na vlastních počítačích, příp. v Apple macOS na vlastních počítačích.

MS Windows

Uživatelské jméno (login) a heslo do MS Windows na učebně jsou stejné jako do Portálu UP. Rozložení klávesnice je zde české (QWERTZ). Přihlásíme se.

Jsou zde předinstalované programy PuTTY a WinSCP. Na vlastních počítačích stáhneme jejich portabilní verze (bez potřeby instalace) z putty.software (Download, Alternative binary files, soubor putty.exe pro 64-bit x86), resp. winscp.net (Download, other downloads, Portable executables, Download, soubor WinSCP-x.y.z-Portable.zip). Použijeme je ke vzdálenému připojení k linuxovému serveru phoenix.inf.upol.cz pro zadávání textových příkazů (PuTTY) a přenosu souborů na/z něj (WinSCP).

Login a heslo do linuxu

Uživatelské jméno (login) a náhodně vygenerované heslo na phoenix.inf.upol.cz a do linuxu na učebnách byly uživatelům zaslány na UP mail (předmět: Heslo do linuxu na KI pro ucet login). Jméno je stejné jako do Portálu UP, heslo ale nikoliv! Heslo obsahuje i speciální znaky (mimo písmena a číslice), je doporučeno jej z mailu zkopírovat a vložit do místa zadávání.

Vzdálené textové připojení k linuxovému serveru – PuTTY

PuTTY je svobodný SSH aj. klient a emulátor textového terminálu ("příkazový řádek", CLI = Command Line Interface) nejen pro MS Windows. Spustíme jej a připojíme (přihlásíme) se k SSH serveru phoenix.inf.upol.cz tak, že toto jméno zadáme do pole Host Name (or IP address) a stiskneme tlačítko Open (nebo klávesu Enter, při prvním připojení je pak ještě potřeba potvrdit bezpečnostní upozornění tlačítkem Accept nebo Connect Once). Poté postupně zadáme v terminálu uživatelské jméno a heslo, za výzvy login as: a password:, s potvrzením obého klávesou Enter. POZOR: Při zadávání hesla není od terminálu žádná odezva (žádné hvězdičky, puntíky apod., z bezpečnostních důvodů)! Pro vložení zkopírovaného hesla ze schránky zde nefunguje klávesová zkratka Control-V, vložení se provede klávesovou zkratkou Shift-Insert nebo stisknutím pravého tlačítka myši (nad terminálem).

Po úspěšném připojení se v terminálu zobrazí úvodní "banner" a na posledním řádku výzva (prompt) k zadání příkazu. Zadáme příkaz logout nebo exit (s potvrzením klávesou Enter) a tím se od serveru odpojíme (odhlásíme).

– Úkol 1:
V MS Windows případně stáhněte a spusťte program
PuTTY (Download, Alternative binary files, soubor putty.exe pro 64-bit x86), připojte (přihlašte) se pomocí něj pod svým uživatelským jménem k serveru phoenix.inf.upol.cz a odpojte (odhlašte) se z něj.

Přenos souborů na/z linuxového serveru – WinSCP

WinSCP je grafický SFTP (SCP) aj. klient pro MS Windows. Spustíme jej a opět se připojíme (přihlásíme) k SSH serveru phoenix.inf.upol.cz. Do pole Host name: zadáme toto jméno, volitelně můžeme do polí User name: a Password: zadat uživatelské jméno a heslo, a stiskneme tlačítko Login (nebo klávesu Enter, při prvním připojení je pak opět ještě potřeba potvrdit bezpečnostní upozornění tlačítkem Accept). Poté, pokud jsme je nezadali už v předchozím dialogu, postupně zadáme uživatelské jméno a heslo, do polí Username: a Password: (s potvrzením obého klávesou Enter nebo tlačítkem OK).

Po úspěšném připojení je v levé části okna zobrazen seznam souborů a adresářů na místním počítači, v pravé části na serveru. Soubor nebo adresář zkopírujeme z místního počítače na server (upload) například tak, že v seznamu pro server otevřeme cílový adresář na serveru (klávesami ↑ a ↓ a Enter nebo myší, výchozí je domovský adresář uživatele), v seznamu pro místní počítač zvolíme soubor nebo adresář (focus) a stiskneme klávesu F5 (a potvrdíme klávesou Enter nebo tlačítkem OK). Kopírování ze serveru na místní počítač (download) provedeme stejně, jen zaměníme server a místní počítač. Pro přesun označení (focus) mezi seznamy pro místní počítač a server můžeme použít i klávesu Tab. Soubory a adresáře můžeme i přesouvat (klávesa F6), mazat (F8), přejmenovat (F2) nebo vytvářet nové (adresáře F7). Odpojení (odhlášení) se od serveru provedeme jednoduše ukončením programu (s potvrzením tlačítkem Yes).

– Úkol 2:
V MS Windows případně stáhněte a spusťte program WinSCP (Download, other downloads, Portable executables, Download, soubor WinSCP-x.y.z-Portable.zip), připojte (přihlašte) se pomocí něj pod svým uživatelským jménem k serveru phoenix.inf.upol.cz, zkopírujte nějaký soubor nebo adresář z MS Windows na server a zpět a odpojte (odhlašte) se ze serveru.

Apple macOS

V Apple macOS můžeme ke vzdálenému připojení k linuxovému serveru phoenix.inf.upol.cz použít aplikace Terminál pro zadávání textových příkazů, ve spojení s programem ssh, a Cyberduck k přenosu souborů na/ze server/u.

Vzdálené textové připojení k linuxovému serveru – Terminál a příkaz ssh

Terminál je předinstalovaný emulátor textového terminálu ("příkazový řádek"). Po jeho spuštění se v něm k SSH serveru phoenix.inf.upol.cz připojíme (přihlásíme) pomocí programu SSH klienta zadáním příkazu ssh login@phoenix.inf.upol.cz, kde login je uživatelské jméno, s potvrzením klávesou Enter. Zadáváme pouze heslo, za výzvu password: (pokud v příkazu nezadáme část login@, zadáváme před heslem i uživatelské jméno, za výzvu login:) a opět POZOR, při zadávání hesla není od terminálu žádná odezva! Zadání hesla potvrdíme taktéž klávesou Enter. Po úspěšném připojení je to stejné jako u PuTTY.

Přenos souborů na/z linuxového serveru – Cyberduck

Cyberduck je grafický SFTP (SCP) aj. klient a je potřeba jej doinstalovat z App Store (v nabídce pod ikonou "jablka" v levém horním rohu obrazovky) nebo cyberduck.io (Download, Cyberduck for macOS, soubor Cyberduck-x.y.z.w.zip). Po jeho spuštění se k SSH serveru phoenix.inf.upol.cz připojíme (přihlásíme) tak, že v titulkovém pruhu okna klikneme na Nové spojení, v dialogu v roletkové nabídce nahoře zvolíme SFTP (SSH File Transfer Protocol), jméno serveru zadáme do pole Server: a uživatelské jméno do pole Jméno:. Heslo zde můžeme volitelně zadat také, do pole Heslo:, nebo ho zadáme až v následném dialogu, po jehož potvrzení a úspěšném připojení je v okně zobrazen seznam souborů a adresářů na serveru. Odpojení (odhlášení) se od serveru pak provedeme kliknutím na ikonu "eject" vpravo v titulkovém pruhu okna nebo jednoduše ukončením programu.

Cvičení 2


Ve druhém cvičení se již přesuneme do unixového systému, do linuxu na učebně nebo na vlastním počítači, příp. do Apple macOS na vlastním počítači.

linux

Na učebně je předinstalovaná distribuce Debian GNU/Linux, kterou zvolíme v nabídce při startu počítače. Na vlastní počítač případně nainstalujeme kteroukoliv zvolenou distribuci linuxu (přehled např. na Linux.cz). Výchozí uživatelské rozhraní na učebně je grafické, výchozím uživatelským prostředím po přihlášení uživatele je desktop Gnome.

Přihlašovací obrazovka (GDM)

Do linuxu na učebně se přihlásíme pomocí stejného uživatelského jména (login) a hesla jako na server phoenix.inf.upol.cz, ke kterému jsme se připojovali v předchozím cvičení. POZOR: Před prvním přihlášením se do linuxu na učebně je nutné se předtím přihlásit (skrze SSH) na server phoenix.inf.upol.cz! – pomocí PuTTY v MS Windows nebo programu ssh v linuxu a Apple macOS; toto máme hotovo z prvního cvičení.

Pokud jsme se na daném počítači již do linuxu někdy dříve přihlásili, můžeme vybrat (klinutím) své plné jméno v seznamu uprostřed přihlašovací obrazovky. V opačném případě klikneme na text Nejste na seznamu? pod seznamem a zadáme své uživatelské jméno (s potvrzením klávesou Enter). Následně, při zadávání hesla, se místo zadávaných znaků vypisují puntíky a zadané skutečné znaky je možné zobrazit a skrýt kliknutím na ikonku "oka". Zadané heslo opět potvrdíme klávesou Enter.

Na přihlašovací obrazovce je možné, pro zadání uživatelského jména a zejména hesla, zvolit rozložení klávesnice, anglické nebo české (QWERTY), a to kliknutím na indikátor aktuálního rozložení en, resp. cs, v pravém horním rohu obrazovky a volbou v nabídce nebo přímo klávesovou zkratkou Super-mezerník (či Windows-mezerník). Vedle indikátoru aktuálního rozložení klávesnice jsou také ikony pro nastavení záležitostí přístupnosti (accessibility, ikona "panáčka" nalevo) a pro vypnutí a restartování počítače (ikona "vypínače" napravo, zcela v rohu obrazovky; možnost uspání počítače je vypnutá).

– Úkol 1:
Přihlašte se v grafické přihlašovací obrazovce (GDM) pod svým uživatelským jménem do unixového systému (linux) a následující provádějte v něm. (V případě linuxu na učebně je nutné se před prvním přihlášením zde předtím přihlásit (skrze SSH) na server phoenix.inf.upol.cz! – pomocí PuTTY v MS Windows nebo programu ssh v linuxu a Apple macOS.)

Uživatelské prostředí – desktop Gnome

Ihned po přihlášení uživatele (zahájení uživatelského sezení, session) může být zobrazen přehled Činností, viz další odstavec, v tom případě stačí kliknout na prázdnou plochu nebo na okno kterékoliv případně spuštěné aplikace. V případě prvního přihlášení uživatele může být spuštěna stručná úvodní prohlídka, kterou je možné přeskočit.

Téměř veškerá aktivita v desktopu, včetně spouštění aplikací, se děje skrze přehled Činností, který vyvoláme nejrychleji stiskem klávesy Super (Windows), ale také kliknutím na "pomlčku s tečkou" zcela vlevo v horní liště desktopu nebo pouhým najetím myši zcela do levého horního rohu obrazovky. Stejnými způsoby se vrátíme zpět do pracovní plochy, plus také klávesou Esc. Aplikace lze v přehledu spustit kliknutím na ikonu aplikace v nabídce (toolbar) dole na obrazovce nebo přímo psaním jména aplikace (nebo něčeho, co s aplikací souvisí) a následně kliknutím na ikonu nabídnuté vyhledané aplikace (ikonu lze vybrat i klávesami ← a → a následně aplikaci spustit pomocí klávesy Enter). Nabídku všech (grafických) aplikací lze zobrazit kliknutím na "mřížku teček" v toolbaru, nabídkou lze skrolovat kolečkem myši (nebo i klávesami PageUp a PageDown, výběr ikony aplikace i klávesami šipek). Tuto nabídku opustíme, bez spuštění aplikace, opět klávesou Esc.

Uživatelské prostředí desktopu je běžné okenní, běžící aplikace se zobrazují v (možno i překrývajících se) oknech. Okno můžeme přesouvat tažením myší nejen za titulkový pruh, ale při stisknuté klávese Super také kdekoliv v okně, nebo po stisku Alt-F7 i klávesami šipek (a potvrzením klávesou Enter). Změna velikosti okna je možná klasicky tažením myší za hranu okna, ale také opět po stisku Alt-F8 i klávesami šipek. Vedle tlačítek v titulkovém pruhu okno maximalizujeme i pomocí Alt-F10 a zavřeme (aplikaci ukončíme) pomocí Alt-F4. Mezi okny různých aplikací se přepneme klasicky pomocí Alt-Tab (nebo i Super-Tab), mezi okny téže aplikace pak pomocí Alt-` (Super-`). Akce přesunu, zavření a přepnutí okna můžeme provádět, klinutím nebo tažením myší, i v přehledu Činností, kde se všechna okna zobrazují zmenšená a nepřekrývající se.

Desktop standardně podporuje více pracovních ploch. Kromě těch s přítomnými okny je (ve výchozím nastavení) vždy k dispozici další prázdná plocha navíc. Okna můžeme přesouvat i mezi plochami, pro přepnutí na jinou plochu máme několik možností: skrolování kolečkem myši nad indikátorem ploch zcela vlevo v horní liště (ona "pomlčka" pro aktivní plochu a "tečky" pro další), klávesami PageUp a PageDown v přehledu Činností, kde jsou miniatury ploch zobrazeny vpravo, nebo přímo klávesovými zkratkami Super-PageUp a Super-PageDown. Za povšimnutí stojí absence jakýchkoliv ikon (aplikací, souborů nebo adresářů) na plochách a nemožnost je tam nějak přidat. To je vlastnost desktopu Gnome, existuje ale způsob, jak ikony souborů a adresářů na plochu přidat: rozšíření (extension) Gnome, např. Desktop Icons NG.

Mezi základní aplikace grafického uživatelského prostředí dnes jistě patří prohlížeč souborů, webový prohlížeč a textový editor. V linuxu máme tradičně na výběr; aktuálně výchozí v desktopu Gnome jsou to aplikace Soubory, Firefox a Textový editor, ale dostupné (předinstalované na učebně nebo v distribuci) jsou i např. webový prohlížeč Chromium nebo textový editor Gedit. Počínaje třetím cvičením budeme používat ještě emulátor textového terminálu v podobě například výchozí aplikace Terminál.

– Úkol 2:
V grafickém uživatelském prostředí (Gnome) spusťte dostupný prohlížeč souborů (Soubory), webový prohlížeč (Firefox, Chromium) a textový editor (Textový editor, Gedit), přepínejte mezi jejich okny, okny posunujte, přesuňte je na jinou plochu desktopu, přepínejte plochy.

Pokud je nastavených více rozložení klávesnice, nalezneme opět indikátor aktuálního rozložení en, resp. cs, stejně jako na přihlašovací obrazovce, v pravém horním rohu obrazovky, v horní liště nalevo od indikátorů zařízení (zvuku, sítě aj.). Rozložení opět změníme kliknutím na indikátor a volbou v nabídce nebo přímo klávesovou zkratkou Super-mezerník (Windows-mezerník). Navíc jsou nyní v nabídce s rozloženími také možnosti zobrazení aktuálního rozložení (včetně variant při stisku modifikátorů Shift nebo RightAlt/AltGr!) a nastavení klávesnice včetně přidání/odebrání rozložení. Pokud je ovšem nastaveno pouze jedno rozložení klávesnice, indikátor aktuálního rozložení zobrazen není a k nastavení klávesnice se dostaneme v rámci nastavení celého desktopu, aplikace Nastavení. K tomu vede cesta i skrze systémovou nabídku. Tu otevřeme kliknutím na indikátory zařízení (spolu s ikonou "vypínače") zcela vpravo v horní liště a Nastavení jsou pod ikonou "ozubeného kolečka". V okně Nastavení pak v seznamu vlevo vybereme položku Klávesnice a rozložení klávesnice zde můžeme přidat nebo odebrat nastavením Vstupních zdrojů.

– Úkol 3:
Zkontrolujte v grafickém uživatelském prostředí (Gnome) dostupnost volby anglického a českého rozložení klávesnice, pokud některé z nich chybí, přidejte jej (Nastavení, Klávesnice), mezi rozloženími přepínejte a zobrazte si je.

Vzdálené připojení k MS Windows

V prvním cvičení jsme se vzdáleně textově připojovali k linuxovému serveru phoenix.inf.upol.cz z MS Windows pomocí SSH klienta PuTTY. Přestože PuTTY je dostupné i pro linux, z linuxu se k serveru připojíme až ve třetím cvičení pomocí programu ssh v textovém uživatelském prostředí ("příkazový řádek", podobně jako v prvním cvičení v případě Apple macOS).

Nyní se připojíme (přihlásíme) vzdáleně graficky k MS Windows serveru terminal.inf.upol.cz. V desktopu Gnome je tomu jednoduchá aplikace Připojení, klient vzdálené pracovní plochy (samozřejmě jsou k dispozici i další, např. Remmina). Po jejím spuštění klikneme na ikonu "plus" vlevo v titulkovém pruhu okna, zadáme síťové jméno terminal.inf.upol.cz, typ připojení ponecháme RDP a stiskneme tlačítko Připojit (při prvním připojení je ještě potřeba potvrdit bezpečnostní upozornění). POZOR: Server terminal.inf.upol.cz je dostupný pouze z univerzitní sítě (pro připojení odjinud je nutné vytvořit VPN připojení k univerzitní síti)! Do polí Uživatelské jméno... a Heslo... zadáme uživatelské jméno (login) a heslo do MS Windows (stejné jako do Portálu UP, do pole Doména... není třeba nic zadávat, ale můžeme zadat PRFAD) a stiskneme tlačítko Ověřit. Pro opětovné připojení k serveru, ke kterému jsme se již někdy dříve připojovali, pak stačí v okně aplikace kliknout na dlaždici se jménem serveru.

– Úkol 4:
Pomocí aplikace Připojení (nebo jiné pro vzdálené RDP připojení) se připojte (přihlašte) pod svým uživatelským jménem k MS Windows serveru terminal.inf.upol.cz a odpojte (odhlašte) se z něj.

Připojení síťového disku

Pro přenos souborů na/z MS Windows můžeme využít připojení adresáře jako síťového disku, přímo v prohlížeči souborů (v desktopu Gnome aplikace Soubory). Připojíme si uživatelský domovský adresář v MS Windows na učebnách a serverech katedry. V okně aplikace Soubory vybereme v seznamu vlevo položku Síť, do pole dole zadáme adresu smb://dragon.inf.upol.cz/students-homes/login, kde login je uživatelské jméno do MS Windows (smb je označení síťové služby sdílení souborů a adresářů v MS Window, dragon.inf.upol.cz je síťové jméno serveru a students-homes je adresář s domovskými adresáři uživatelů) a stiskneme tlačítko Připojit. POZOR: I server dragon.inf.upol.cz je dostupný pouze z univerzitní sítě (a pro připojení odjinud je nutná VPN)! V následném dialogu zvolíme Registrovaný uživatel, zadáme uživatelské jméno (login) a heslo do MS Windows, do polí Uživatelské jméno a Heslo, do pole Doména zadáme PRFAD (zde je to nutné) a stiskneme tlačítko Připojit. Po ukončení práce s připojeným síťovým diskem jej odpojíme například kliknutím v okně aplikace Soubory na ikonu "eject" vedle pojmenování disku (adresáře) v seznamu vlevo. V okně, po výběru vlevo položky Síť, rovněž vidíme seznam připojení z dřívějška a pro opětovné připojení stačí vybrat položku seznamu (jako otevření adresáře). Užitečný může být na serveru dragon.inf.upol.cz také adresář vyuka, obsahující výukové materiály od vyučujících (adresa smb://dragon.inf.upol.cz/vyuka).

Podobně si můžeme připojit jako síťový disk i adresář z linuxového serveru, v našem případě uživatelský domovský adresář na serveru phoenix.inf.upol.cz. Adresa bude jen ssh://phoenix.inf.upol.cz (bez zadání adresáře, domovský adresář uživatele je výchozí; také je možné místo ssh zadat sftp). Uživatelské jméno (login) a heslo je na tento server. V linuxu na učebně je toto připojení ale nadbytečné, protože uživatelské domovské adresáře na serveru phoenix.inf.upol.cz jsou zde připojeny automaticky při startu systému a fungují jako domovské adresáře uživatelů přihlašovaných i na učebně.

– Úkol 5:
V prohlížeči souborů (Soubory) si připojte pod svým uživatelským jménem jako síťový disk Váš domovský adresář dragon.inf.upol.cz/students-homes/login (kde login je Vaše uživatelské jméno) v MS Windows, zkopírujte nějaký soubor nebo adresář z linuxu na disk (do adresáře v MS Windows) a zpět a disk odpojte.

Nápověda a odhlášení

Na závěr se ještě vrátíme k samotnému uživatelskému prostředí, desktopu Gnome. Má výborně zpracovanou a do češtiny přeloženou nápovědu v podobě aplikace Nápověda.

Nakonec, cesta k odhlášení se ze systému vede přes systémovou nabídku (ale i přímo přes klávesovou zkratku Control-Alt-Delete). K té se, pro zajímavost, vedle již zmíněného kliknutí na indikátory zařízení (spolu s ikonou "vypínače") zcela vpravo v horní liště, můžeme dostat i pomocí pouze klávesnice: zkratka Control-Alt-Tab, volba Horní lišta a poté klávesy šipek a Enter. Kromě nastavení celého desktopu ("ozubené kolečko") a různých tlačítek a jiných prvků pro nastavení zařízení (zvuku, sítě aj.) jsou zde i ikony pro uzamčení desktopu (uživatelského sezení, ikona "zámku", pro odemčení je nutné zadat heslo) a pro vypnutí a restartování počítače (ikona "vypínače"; možnost uspání počítače je na učebně vypnutá). A pod touto druhou ikonou je právě ukrytá i možnost odhlášení se ze systému (ukončení uživatelského sezení), případně také dočasného přepnutí na jiného uživatele (to znamená uzamčení sezení, přihlášení se jiného uživatele a po jeho odhlášení odemčení sezení).

– Úkol 6:
Prohlédněte si nápovědu grafického uživatelského prostředí (Gnome) a nakonec se ze systému odhlašte.

Ještě poznámka: na přihlašovací obrazovce GDM na učebně je možné zvolit pro sezení (session) jiné předinstalované uživatelské prostředi než výchozí desktop Gnome – po výběru nebo zadání uživatelského jména, před potvrzením hesla, kliknutím na ikonu "ozubené kolečko" v pravém dolním rohu obrazovky a výběrem položky.

Apple macOS

Přihlašovací obrazovka

V Apple macOS je uživatelské rozhraní rovněž grafické, přihlašovací obrazovka je podobná jako v linuxu. Přihlášení zadáním hesla funguje stejně, možnost volby rozložení klávesnice v pravém horním rohu obrazovky zde může být také, stejně jako je zde ikona pro vypnutí a restartování počítače.

Uživatelské prostředí

Uživatelské prostředí je bežné okenní, není zde ovšem přehled Činností jako v desktopu Gnome. Nabídka (toolbar) dole na obrazovce s vybranými aplikacemi je přítomná vždy, všechny aplikace jsou dostupné pod ikonou "barevných čtverečků" (Launchpad), kde je pak i možnost vyhledání aplikace psaním jejího jména. Práce s okny je klasická, pro přepínání mezi okny (aplikacemi) slouží klávesová zkratka command-Tab. Atypické je umístění nabídky (menu) aplikace, která bývá obvykle v okně dané aplikace pod titulkovým pruhem, do horní lišty celého prostředí. Více pracovních ploch prostředí nepodporuje, na plochu je ale možné standardně umísťovat ikony souborů a adresářů.

Aplikacemi prohlížeče souborů, webového prohlížeče a textového editoru jsou Finder, Safari a TextEdit, emulátor textového terminálu je rovněž aplikace Terminál (již jsme ji použili v prvním cvičení).

Se změnou rozložení klávesnice kliknutím na indikátor aktuálního rozložení v horní liště vpravo, nalevo od indikátorů zařízení (zvuku, sítě aj.), je to stejné jako v desktopu Gnome. Pro změnu přímo je klávesová zkratka control-mezerník. V nabídce s rozloženími jsou také možnosti zobrazení aktuálního rozložení (Zobrazit prohlížeč klávesnic, včetně varianty při stisku modifikátoru option) a nastavení klávesnice, ke kterému se dostaneme i rámci nastavení celého systému, aplikace Nastavení systému. K tomu vede cesta i skrze systémovou nabídku, kterou otevřeme kliknutím na ikonu "jablka" zcela vlevo v horní liště. V okně Nastavení systému pak v seznamu vlevo vybereme položku Klávesnice, pod titulkem Zadáni textu klikneme na tlačítko Upravit... vedle Vstupní zdroje a v následném dialogu rozložení klávesnice přidáme nebo odebreme.

Vzdálené připojení k MS Windows

Pro toto je potřeba doinstalovat aplikaci pro vzdálené RDP připojení, například oficiální MS Remote Desktop (nově Windows App for Mac), z App Store nebo What's new in Windows App (tab macOS, odkaz na .pkg v tabulce, soubor Windows_App_x.y.z_installer.pkg). Po jejím spuštění se k MS Windows serveru terminal.inf.upol.cz graficky připojíme (přihlásíme) tak, že v nabídce (menu) aplikace vybereme položky Connections a PC Quick Connect..., do pole PC name: zadáme jméno serveru a po stisku tlačítka Connect pokračujeme obdobně jako u aplikace Připojení v desktopu Gnome.

Připojení síťového disku

Připojení adresáře z MS Windows jako síťového disku podporuje přímo prohlížeč souborů (aplikace Finder). Pro připojení uživatelského domovského adresáře v MS Windows na učebnách a serverech katedry vybereme v nabídce (menu) aplikace Finder položky Otevřít a Připojit k serveru... a dále postupujeme obdobně jako u prohlížeče souborů v linuxu (v desktopu Gnome aplikace Soubory).

Připojení adresáře z linuxového serveru, v našem případě uživatelského domovského adresáře na serveru phoenix.inf.upol.cz, jako síťového disku už aplikace Finder přímo nepodporuje. Podporu je potřeba doinstalovat, například Mountain Duck, z App Store nebo z mountainduck.io/ (Download for Mac, soubor Mountain Duck-x.y.z.w.zip). Po spuštění se v horní liště vpravo vedle indikátoru aktuálního rozložení klávesnice objeví ikona "kachničky". Po kliknutí na ni a výběru položky Nové spojení... postupujeme stejně jako u aplikace Cyberduck v prvním cvíčení a po úspěšném připojení je připojený adresář jako síťový disk otevřen v aplikaci Finder. Odpojení disku provedeme například v okně aplikace Fider kliknutím na ikonu "eject" vedle pojmenování disku (adresáře) v seznamu vlevo.

Nápověda a odhlášení

Česká nápověda je (online) dostupná v menu (výchozí) aplikace Finder, položky Nápověda a Nápověda pro macOS.

Odhlášení se ze systému je dostupné skrze systémovou nabídku (ikona "jablka" zcela vlevo v horní liště), položka Odhlásit uživatele jméno.... Navíc zde najdeme i položky pro uzamčení prostředí (Zamknout obrazovku) a pro vypnutí a restartování (a uspání) počítače.

Cvičení 3


Ve třetím cvičení "vyměníme" grafické uživatelské rozhraní za pro unixové systémy původní textové, poskytované emulátorem terminálu Terminál (který je výchozí v grafickém desktopu Gnome) nebo jinou aplikaci tohoto druhu (např. Konsole, xterm apod.). V Apple macOS jde rovněž o aplikaci Terminál. Jelikož jde o aplikaci v grafickém uživatelském prostředí, kde již jsme přihlášeni, v okně (emulátoru) terminálu se po jeho spuštění již znovu nepřihlašujeme. Můžeme ale použít i emulátor terminálu pro vzdálené připojení k unixovému systému, např. k linuxovému serveru phoenix.inf.upol.cz z MS Windows, třeba aplikaci PuTTY z prvního cvičení, kde se ke vzdálenému systému přihlásíme. V tomto textovém rozhraní už víceméně zůstaneme po všechna zbývající cvičení.

– Úkol 1:
V grafickém uživatelském prostředí (Gnome) spusťte aplikaci emulace terminálu (Terminál, Konsole, xterm apod.) a následující provádějte v této aplikaci (terminálu).

Příkazový řádek a interpret (shell)

Uživatelským pracovním prostředím v textovém emulátoru terminálu (dále jen terminálu) je prostředí tzv. příkazového řádku (command line interface, CLI). Ten je poskytovaný programem příkazového interpretu (shell), který je spuštěný v terminálu po případném (vzdáleném) přihlášení uživatele (v rámci uživatelského sezení, session). Výchozím příkazovým interpretem v linuxu na učebně, ale i v mnoha linuxových distribucích a jiných unixových systémech, je shell Bash (Bourne-Again Shell) z projektu GNU. V Apple macOS je výchozí Z shell, ale bývá předinstalovaný i GNU Bash – spustíme jej zadáním v Z shellu příkazu bash (potvrzeném klávesou Enter). Nadále budeme předpokládat shell GNU Bash, ale mnohé je funkční i v Z shellu.

V jednořádkovém prostředí shellu v terminálu (text delší než šířka terminálu pokračuje na dalším řádku, ale je stále uvažovaný jako jeden řádek) mu zadáváme textové příkazy, za výzvu shellu (prompt). Ta je zobrazena na prvním řádku terminálu (shora) od začátku (zleva) a má typickou podobu login@hostname:adresar$ (plus ještě mezera za $), kde login je uživatelské jméno (login), hostname síťové jméno počítače, na kterém shell běží, a adresar je aktuální adresář shellu – shell se vždy "nachází" v nějakém adresáři, výchozí po spuštění shellu je domovský adresář uživatele. Podobně vypadá i prompt Z shellu v Apple macOS, prompt shellu Bash zde ale má strohou podobu bash-verze$. Dodejme, že prompt superuživatele root má na konci typicky # místo $ a že podobu promptu si uživatel může nastavit vlastní (toto ale dělat nebudeme).

Pro další text si zjednodušíme značení klávesových zkratek: C- znamená Control- (tj. za stisku klávesy Control stisknout klávesu uvedenou za -), podobně S- pro Shift-; S-C- znamená Shift-Control-. M- je pro původní klávesu Meta, kterou na současných klávesnicích reprezentuje klávesa (levý) Alt a na klávesnicích Apple ji zastupuje klávesa option, značená O-.

Znaky textu příkazu na příkazovém řádku shellu zadáváme na pozici textového kurzoru (vyplněný obdélník nebo podtržítko, případně blikající), který se s každým zadaným znakem posune o jednu pozici doprava. Po zadaném textu můžeme kurzorem pohybovat a text editovat. Pro pohyb kurzorem po znacích (předchozí a následující) jsou klávesy ← a →, po slovech textu (kde slovo je posloupnost znaků bez mezery nebo tabulátoru), po začátcích, resp. koncích slov, pohybujeme kurzorem pomocí C-← a C-→ (nebo i M-← a M-→), na začátek nebo konec textu kurzor přesuneme pomocí Home a End (nebo také C-a a C-e). Pro základní editaci zadaného textu obvykle fungují Del (pokud ne nebo klávesa není, pak C-d) pro výmaz znaku na kurzoru a Backspace pro výmaz znaku před kurzorem, dle očekávání. Část slova od kurzoru k začátku slova vymažeme pomocí M-Backspace, po konec slova pak pomocí M-d. Znak na kurzoru prohodíme s předchozím znakem pomocí C-t, slovo s kurzorem s předchozím slovem pak pomocí M-t. Část celého textu od kurzoru k začátku textu (po prompt) vymažeme pomocí C-u, po konec textu pak pomocí C-k. Velmi užitečné je to, že jakákoliv vymazaná část slova nebo celého textu je uložena do "schránky řádku" a lze ji opětovně vložit na pozici kurzoru pomocí C-y.

V okně terminálu v grafickém prostředí můžeme využít pro kopírování textu příkazového řádku i pouze myš, případně s klávesovými zkratkami, stejně jako pro kopírování textu v oknech jiných aplikací (přes "schránku", operace copy&paste). V grafickém rozhraní unixových systémů včetně linuxu obvykle stačí text označit myší a pro jeho vložení, například na místo kurzoru v terminálu, jen stisknout kolečko myši. Případně pro zkopírování myší označeného textu a jeho vložení mohou v terminálu fungovat klávesové zkratky S-C-c a S-C-v (v jiných aplikacích jen obvyklé C-c a C-v).

Potvrzení zadaného textu (i prázdného) na příkazovém řádku, tedy "odeslání" jej shellu jako příkazu k vykonání, provedeme klávesou Enter. V terminálu se může zobrazit nějaký výstup vykonání příkazu a poté je opět zobrazena výzva shellu (prompt).

Když je příkazy a jejich výstupy zaplněna celá obrazovka (okno) terminálu, typicky 24 nebo 25 řádků, začne při dalším zobrazovaném textu skrolovat nahoru, tj. nejstarší text (horní řádky) vyroluje "nad" obrazovku. K němu se můžeme vrátit a obrazovkou terminálu, jako náhledem (oknem) na část textu, standardně na poslední, můžeme po celém textu posouvat (skrolovat), klávesovými zkratkami S-PageUp a S-PageDown nebo i kolečkem myši nad terminálem (případně často i dvěma prsty nahoru a dolů po touchpadu). V Apple macOS fungují fn-↑ a fn-↓ (a dva prsty po touchpadu). Text na obrazovce můžeme také vyrolovat (obrazovku smazat) nahoru tak, že na obrazovce zůstane jen prompt na prvním řádku nahoře, klávesovou zkrakou C-l.

– Úkol 2:
Napište do příkazové řádky shellu v terminálu (za výzvu, prompt) jakýkoliv text, pohybujte po něm kurzorem, editujte jej (včetně kopírování) a potvrďte jej shellu jako příkaz (v tuto chvíli nezáleží na tom, jestli platný). Zaplňte textem příkazů a jejich výstupy celou obrazovku (okno) terminálu a poté obrazovkou skrolujte.

Historie příkazů

Shell udržuje historii všech zadaných příkazů, kterou je možné listovat a prohledávat. Historie je, po ukončení shellu, ukládaná do souboru (s omezením na počet příkazů v řádu obvykle stovek nebo tisíců) a jiný shell v jiném terminálu (i v dalším uživatelském sezení) historii ze souboru při svém spuštění načítá a svoji historii příkazů po ukončení do souboru přidává; takže je možné listovat a prohledávat i historii z předchozích shellů. K předchozím příkazům do minulosti se v historii vrátíme pomocí ↑, k následujícím blíže k přítomnosti pomocí ↓. Příkaz z historie se ihned objevuje na řádku za promptem a pro znovuspuštění ho stačí potvrdit. Pro skok na první příkaz v historii obvykle funguje M-<, za poslední příkaz pak M->. Interaktivní vyhledávání v historii zahájíme klávesovou zkratkou C-r (prompt shellu se změní) a pak zadáváme text vyskytující se v hledaném příkazu (mazání pomocí Backspace), který se ihned zobrazuje na řádku a stačí jej potvrdit; nebo vyhledávání zrušíme pomocí C-g. Opětovný stisk C-r během vyhledávání vyhledá předchozí příkaz s výskytem zadaného textu a stisk ↑ nebo ↓ při vyhledaném příkazu zobrazí na řádku příkaz v histori hned před nebo za ním a vyhledávání se ukončí. Doplňme ještě dopředu (viz dále), že celou historii shellu si můžeme zobrazit pomocí příkazu history.

– Úkol 3:
Listujte v shellu historií zadaných příkazů, historii si zobrazte a nějaký předchozí příkaz v historii vyhledejte a spusťte znovu.

Příkazy a programy

Jednoduchý příkaz shellu je seznam slov oddělených mezerami nebo tabulátory (tzv. bílými znaky). První slovo, běžně chápané jako jméno příkazu, se shell snaží vykonat, s dalšími volitelnými slovy jako jeho argumenty, a pokud to není interní příkaz shellu, představuje první slovo název programu, který shell zkusí spustit. Pokud program daného názvu není v systému dostupný, vykonání příkazu (spuštění programu) končí chybou, podobně jako například při chybném seznamu argumentů příkazu. Argumentům začínajícím znakem - (pomlčka) se říká přepínače (options). POZOR: Jména interních příkazů, názvy programů i argumenty jsou (u shellu Bash i jiných) citlivá na velikost písmen, tzv. case-sensitive! U Z a Bash shellu v Apple macOS se to ale týká jen argumentů.

Nyní si již nějaké platné příkazy (s v systému existujícími programy) vyzkoušíme. Například příkaz date, spouštějící program date, zobrazí (vypíše) aktuální systémový datum a čas. Po vyzkoušení příkazů DATE nebo Date se naopak objeví chybová hláška shellu příkaz nenalezen. Příkaz date -d tomorrow +%A s argumenty (-d je přepínač), v Apple macOS date -v+1d +%A, zobrazí jen jméno zítřejšího dne. Co argumenty znamenají, se dozvíme později v nápovědě k programu date. Příkazy who a w zobrazují nějaké infomace k aktuálně přihlášeným uživatelům v systému, druhý příkaz navíc na prvním řádku výpisu informace o době běhu systému a jeho akuálním vytížení. Velmi užitečný, i když se to na první pohled nezdá, je příkaz echo, který "jen" zobrazí (vypíše) v terminálu své argumenty (vyjma přepínačů, kterým "rozumí"), např. echo Ahoj svete!.

Příkazů můžeme na příkazový řádek zadat i více "naráz" a nechat je vykonat postupně všechny po potvrzení jedním Enter. V tom případě je oddělíme znakem ; (středník). Budou vykonány po sobě, další vždy až skončí předchozí (existuje i možnost souběžného vykonávání více příkazů, o tom ale až v šestém cvičení). Například echo -n Pocitac:\ ; hostname. Příkaz echo -n Pocitac:\  (všimněme si mezery za \) zde nejprve zobrazí text Pocitac:  (včetně mezery za :) a příkaz hostname pak síťové jméno počítače. Pro přepínač -n viz nápovědu shellu k příkazu echo dále, konstrukce \  (\ a mezera) představuje způsob, jak na příkazovém řádku zadat mezeru tak, aby byla součástí příkazu a ne oddělovačem jména a argumentů příkazu (více opět viz šesté cvičení).

Vzdálené textové připojení k linuxovému serveru – ssh

Program ssh (secure shell) je textový SSH klient a můžeme jej použít ke vzdálenému připojení (přihlášení) k linuxovému serveru phoenix.inf.upol.cz, podobně jako grafický program PuTTY pro MS Windows v prvním cvičení. Příkaz je ssh login@phoenix.inf.upol.cz, kde login je uživatelské jméno na serveru. Po spuštění příkazu za výzvu password: zadáme heslo na tento server (pokud v příkazu nezadáme část login@, zadáváme před heslem i uživatelské jméno, za výzvu login:), které opět potvrdíme klávesou Enter. POZOR: Při zadávání hesla není od terminálu žádná odezva (z bezpečnostních důvodů)! Po úspěšném připojení k serveru je to stejné jako u PuTTY.

Úkol 4:
Pomocí programu ssh se připojte (přihlašte) pod svým uživatelským jménem na server phoenix.inf.upol.cz a odhlašte se z něj.

Změna hesla a ukončení shellu

Pro změnu hesla uživatele v unixových systémech včetně linuxu bežně slouží program passwd. Za výzvy zadáme postupně stávající a dvakrát nové heslo, potvrzené klávesou Enter. Opět platí, že při zadávání hesel není od terminálu žádná odezva. V linuxu na učebnách, ale i na serveru phoenix.inf.upol.cz, jsou ovšem hesla síťově sdílená (pomocí systému NIS), takže místo passwd je zde nutné pro změnu hesla použít příkaz yppasswd.

Shell ukončíme příkazem exit. Také funguje klávesová zkratka C-d při prázdném zadávaném textu na příkazovém řádku (jen prompt). Pokud je shell tzv. přihlašovací, tzn. vznikl v důsledku přihlášení uživatele, např. přes síťovou službu SSH, lze jej ukončit také příkazem logout (viz první cvičení). Ve všech případech při ukončení shellu v terminálu dojde obvykle automaticky i k ukončení programu emulátoru terminálu (v grafickém prostředí tedy i k uzavření jeho okna; ne ovšem v Apple macOS).

Nápověda shellu a manuálové stránky

Shell má pro každy svůj (interní) příkaz integrovanou nápovědu s popisem příkazu i všech jeho argumentů, dostupnou přes příkaz help. Jako argument zadáme jméno příkazu, např. help echo, bez argumentu zobrazí seznam všech interních příkazů s jejich nejčastějšími argumenty. Pokud bychom chtěli vědět, zda je jméno interní příkaz shellu nebo program, použijeme příkaz type, např. type -a echo (a vidíme, že echo je jak interní příkaz shellu tak i program).

Úkol 5:
Zobrazte nápovědu příkazového interpretu (shellu) k příkazu echo.

Úkol 6:
Pomocí příkazu echo zobrazte Unicode znak s hodnotou (šestnáctkově) 1F600.

Hlavní formou nápovědy v unixových systémech jsou však manuálové stránky, pro (téměř) všechny programy pro textový terminál a někdy i pro grafické programy (ale i pro konfigurační a speciální soubory systému, programátorské funkce a další). Je to primární textová dokumentace programu, kterou si můžeme interaktivně prohlížet přes celou obrazovku terminálu programem man, kterému jako argument zadáme jméno programu, např. man echo. Stránky mají jednotnou strukturu: stručná charakteristika programu, zápis a popis argumentů, podrobnější popis včetně případných příkladů použití, (neinteraktivní) odkazy na jiné stránky a (konfigurační) soubory, informace o autorech, hlášení chyb a další. Interakci prohlížení stránky obvykle zajišťuje program less, ve kterém se můžeme po stránce posouvat po řádcích pomocí ↑ a ↓ nebo kolečkem myši (nebo prstem či prsty na touchpadu), po obrazovkách pomocí PagegUp a PageDown, přejít na začátek nebo konec stránky pomocí Home (také <) a End (>), ve stránce vyhledávat pomocí / (ke konci) nebo ? (k začátku) a zadáním textu spolu s Enter, opakovat poslední vyhledání pomocí n (ve směru prvního vyhledání) a N (proti směru), zobrazit vlastní nápovědu se stejnými možnostmi pomocí h a konečně opustit tuto nápovědu nebo i zobrazení manuálové stránky pomocí q.

Dodejme ještě, že manuálové stránky můžeme vyhledávat přes (přesné) jméno programu pomocí whatis a přes klíčové slovo v popisu programu v manuálové stránce pomocí apropos, kde jméno nebo slovo je argumentem těchto programů.

Úkol 7:
Prohlédněte si manuálovou stránku programu date. Co zobrazí příkaz date +%A\ %e. a proč?

Úkol 8:
Pomocí programu date (a jeho manuálové stránky) zobrazte aktuální datum ve tvaru DD. MM. RRRR (včetně mezer za tečkami).

GNU Info

V unixových systémech se základními programy z projektu GNU, tedy i v linuxových distribucích, ne však v Apple macOS, bývá k dispozici i další dokumentace, GNU Info, pro programy a programové celky či balíky. Příkaz info bez argumentu zobrazí "rozcestníkovou" stránku pro všechnu tuto dokumentaci, která je organizovaná hierarchicky s hypertextovými odkazy (podobně jako web). Ze stránky můžeme interaktivně přejít na odkazovanou stránku následováním odkazu, zobrazeného s podtrženým textem a * (hvězdičkou) před ním, klávesou Enter po přesunu kurzoru na text, na v hierarchii nadřazenou stránku pomocí u. Prohlížení samotné stránky je podobné jako u manuálové stránky, akorát klávesy šipek pohybují kurzorem a ne stránkou, navíc interaktivní vyhledávání je zahájeno pomocí C-s nebo C-r a ihned se vyhledává následně zadaný text se zrušením pomocí C-g, interní nápovědu vyvoláme pomocí H (a zavřeme pomocí l). Za prozkoumání stojí stránka pro balík programů GNU Coreutils, info coreutils, neboť ten tvoří základní programové vybavení unixových systémů, včetně programů pro základní manipulaci se soubory a s textem, kterými se v dalších cvičeních budeme zabývat.

Cvičení 4


Ve čtvrtém cvičení zůstaneme v unixovém textovém uživatelském rozhraní emulátoru terminálu z předchozího třetího cvičení a pracovním prostředí příkazového řádku (CLI) a interpretu, shellu (GNU Bash). Podíváme se na základní práci se soubory a adresáři. Většina následujících programů, i v dalších cvičeních, je z balíku GNU Coreutils.

Soubory a adresáře

Cestu k aktuálnímu adresáři shellu (shell se vždy "nachází" v nějakém adresáři, výchozí po jeho spuštění je domovský adresář uživatele) zjistíme pomocí příkazu pwd. Pro zobrazení (výpis) obsahu adresáře, tj. seznamu jmen souborů a podadresářů adresáře, slouží program ls (nebo téměř stejný dir). Bez argumentů, ls zobrazí pouze tento seznam, formátovaný do vícesloupcové tabulky na obrazovku terminálu, pro aktuální adresář. Jména mohou být obarvená, například jména (pod)adresářů modře a jména souborů s vybranými příponami různými jinými barvami, ale to záleží na nastavení shellu (a možnostech emulátoru terminálu). Další užitečné údaje k souborům a adresářům přidáme přepínačem -l: ls -l. Jména jsou nyní v posledním sloupci zobrazené tabulky, první znak prvního sloupce značí typ položky, například - (pomlčka) pro soubor, d pro adresář (další znaky prvního sloupce se týkají uživatelským práv, která si vysvětlíme v příštím, pátem cvičení). Ve sloupci před jmény je datum a čas poslední změny obsahu souboru nebo adresáře (u adresáře to znamená změna seznamu souborů nebo podadresářů adresáře) a ve sloupci před tímto je zobrazena velikost souboru v bytech. V případě adresáře to ale není velikost adresáře ve smyslu součtu velikostí všech souborů v něm (rekurzivně v celém adresářovém podstromu), k tomu je program du níže, ale technický údaj o alokované velikosti pro obsah adresáře (tj. seznam). Pro zobrazení velikosti v nejbližším 1024-násobku bytů, tedy v kB, MB, GB atd. (tzv. "lidsky čitelný formát", "human readable"), stačí přidat ještě přepínač -h: ls -l -h, nebo i ls -lh, protože jednopísmenné přepínače lze takto "slučovat" za jednu pomlčku. Tzv. skryté soubory a adresáře přidáme do výpisu přepínačem -a: ls -a; bez něj se nezobrazují (to je celá "skrytost").

Úkol 1:
Zobrazte cestu k aktuálnímu adresáři.

Úkol 2:
Zobrazte seznam všech souborů a podadresářů, včetně tzv. skrytých, v aktuálním adresáři (= obsah adresáře) s podrobnějšími informacemi (jméno, velikost, datum, práva aj.) o nich.

Můžeme zobrazit i obsah jakéhokoliv jiného adresáře než aktuálního, když cestu k němu (relativní nebo absolutní) přidáme ls také jako argument, např. pro cestu pouze jméno ls -l public_html (předpokládáme existenci adresáře public_html v aktuálním adresáři, což je v případě domovského adresáře uživatelů na učebnách a serveru phoenix.inf.upol.cz předpřipravená situace a domovský adresář je po přihlášení uživatele výchozí aktuální). Můžeme zadat i cestu k souboru, ale to zobrazí jen výpis k samotnému souboru (což může být i tak užitečné např. ve spojení s přepínačem -l). Cest můžeme zadat i více současně, výpis je zobrazem pro každou z nich. Speciální jména . (tečka) a .. (dvě tečky) značí aktuální adresář (ten je ale bez zadání cesty u ls výchozí) a rodičovský adresář. POZOR: Jména souborů a adresářů, uváděná v cestách ale i celkově, stejně jako jména interních příkazů shellu a programů, jsou citlivá na velikost písmen (case-sensitive)! Opět se to ale netýká Apple macOS.

Pro změnu aktuálního adresáře obsahuje shell příkaz cd. Bez udání cesty jako argumentu "přepne" do domovského adresáře uživatele, pro znak - (pomlčka) jako cestu "přepne" do předchozího aktuálního adresáře (shell si pamatuje celou posloupnost aktuálních adresářů). Pro vytvoření nového (prázdného) podadresáře v aktuálním adresáři použijeme program mkdir, kterému je nutné zadat jméno nově vytvářeného adresáře, např. mkdir pokusy.

Úkol 3:
Vytvořte adresář tmp, vejděte do něj a vyjděte z něj do nadřazeného (rodičovského) adresáře.

Zmíněnou velikost adresáře ve smyslu součtu velikostí všech souborů v něm (rekurzivně v celém adresářovém podstromu) získáme programem du. Tento ale bez přepínače vypisuje velikost (a cestu) pro všechny podadresáře aktuálního adresáře, a to rekurzivně v celém podstromu adresáře (tj. pro všechny podadresáře všech jeho poadresářů), což obvykle nechceme, takže rovnou přidáme přepínač -s: du -s. Pro velikost v násobcích bytů ("human readable") opět podporuje přepínač -h: du -sh, pro jiný adresář než aktuální stačí zadat cestu k němu jako argument (i více cest).

Úkol 4:
Zobrazte velikost aktuálního adresáře (program du).

Doplňování jména v příkazovém řádku – Tab

Nesmírně užitečná je v příkazovém řádku funcionalita shellu (GNU Bash, ale i jiných) doplňování jména souboru nebo adresáře, ale také interního příkazu shellu i programu ke spuštění, a někdy (u GNU Bash) i argumentů, často přepínačů, všude tam, kde je toto jméno očekáváno, typicky jako součást cesty jako argumentu příkazu. Aktivuje se klávesou Tab (tabulátor). Volitelně zadáme začátek jména a stiskneme Tab. Pokud existuje pouze jediná možnost doplnění (jediný existující soubor, adresář, program apod. s takto začínajícím jménem), celý zbytek jména je doplněn! Pokud je možností doplnění víc, je případně doplněn nejdelší společný začátek jména a při dalším stisku Tab je zobrazen seznam všech doplnění jména (formou tabulky)! Dopíšeme další znak(y) a zkusíme Tab znovu pro doplnění celého zbytku jména. Pokud je seznam (tabulka) větší než co se vleze na obrazovku terminálu, může být jeho zobrazení pozastaveno po první obrazovce – další část (obrazovku) zobrazíme stiskem klávesy mezerník, nebo zobrazení ukončíme pomocí q. A pokud je seznam velký příliš, může se ještě před zobrazením jeho první části objevit dotaz na toto zobrazení, s možnými odpověďmi y pro ano a n pro ne. Pokud chceme do příkazového řádku zadat samotný znak tabulátoru, musíme použít kombinaci C-v TAB, tj. TAB po C-v.

– Úkol 5:
Při zadávání příkazů, jmen programů a souborů nebo adresářů stiskněte (opakovaně) klávesu Tab!

Obsah souboru

V terminálu si můžeme zobrazit obsah jakéhokoliv souboru (nejen obsah např. manuálové stránky), ale vzhledem k tomu, že jde o textový terminál, je zde bezpečné zobrazovat pouze textové soubory (tzv. plain text, více v osmém cvičení, soubory typicky s příponou jména .txt, konfigurační, logovací aj.). Případné speciální netextové znaky mohou terminál nepříjemně ovlivnit (zobrazení znaků v terminálu, jeho chování aj.). Nejjednodušší program pro zobrazení (výpis) obsahu souboru v (do) terminálu je cat, kde cestu k souboru mu zadáme jako argument, např. cat public_html/welcome.html. Pokud je ale obsah souboru větší než co se vleze na obrazovku terminálu, předchozí obsah vyroluje a v terminálu zůstane jen konec obsahu velikosti obrazovky. K němu se sice můžeme vrátit (skrolováním terminálu), ale komfortnější je si obsah souboru na obrazovce terminálu prohlížet interaktivně, stejně jako manuálové stránky, programem less: less public_html/welcome.html. Jeho základní ovládání jsme si již uvedli u popisu manuálových stránek a jejich prohlížeče man, protože ten používá less. Pokud si (pouze textovým) obsahem souboru nejsme jisti nebo jen chceme napovědět, jakého typu obsah je ("co je soubor zač"), může se hodit program file. Ten se snaží typ obsahu souboru (zadaného mu jako argument) identifikovat s využitím své "databáze" charakteristik a typických částí obsahu (signatur).

– Úkol 6:
Pomocí (grafického) textového editoru (např. aplikace Textový editor nebo Gedit) upravte obsah souboru welcome.html v adresáři public_html ve vašem domovském adresáři (na serveru phoenix.inf.upol.cz je tento soubor interpretován jako webová stránka dostupná na adrese http://phoenix.inf.upol.cz/~login, kde login je uživatelské jméno).

Úkol 7:
Zobrazte obsah souboru welcome.html z předchozího úkolu (programy cat, less).

Kopírování, přesun a mazání souborů a adresářů

Pro kopírování a přesun (plus přejmenování, technicky je to totéž co přesun) souborů a adresářů jsou v unixových systémech standardní programy cp a mv. Akceptují minimálně dvě cesty jako argumenty, všechny kromě poslední chápané jako existující zdroje ("co") a poslední jako případně neexistující cíl ("kam"). Pokud je zdroj zadaný jeden, nemůže to (přirozeně) být cesta k adresáři a současně cíl cesta k existujícímu souboru, a cíl nemusí existovat – tzn. kopie nebo přejmenování zdroje na cíl, jinak při existenci cíle kopie nebo přesun zdroje do cíle. Pokud je zdrojů zadaných víc než jeden, cíl pak musí být cesta k existujícímu adresáři. V případě kopie zdroje jako cesty k adresáři je pak nutné, pro kopii celého adresáře včetně jeho obsahu (i prázdného), doplnit přepínač -r (recursive): cp -r adresář cíl. Pro mazání je standardní program rm, kterému se jako argumenty rovněž předávají cesty a pokud je to cesta k adresáři, pak je opět pro výmaz celého adresáře včetně jeho obsahu (i prázdného – pouze takový lze smazat i programem rmdir) nutné přidat přepínač -r: rm -r adresář.

Programy cp, mv a rm mají společné "klasické" přepínače -i, -f a -v. Přepínač -i (interactive) zapíná tzv. interaktivní režim, což znamená, že před každou operací, při které by mohlo dojít ke ztrátě dat (přepsáním nebo vymazáním souboru nebo adresáře) se program nejdříve dotáže na svolení operaci provést (s možnými odpověďmi y pro ano a n pro ne). To podporuje bezpečné provádění operací (v unixových systémech standardně neexistuje možnost obnovení přepsaných nebo smazaných souborů a adresářů!) a v linuxových distribucích bývá tento přepínač při vykonávání těchto programů často automaticky doplňovaný. Na druhou stranu například ve spojení s přepínačem -r takových dotazů nemusí být málo (navíc zde jsou ještě dotazy pro vstup do každého (pod)adresáře). Proto přepínač -f (force) naopak veškeré dotazy potlačuje, což ovšem může být nebezpečné. Přepínač -v (verbose) pak zapíná tzv. "ukecaný" režim, kdy je uživatel o každé jednotlivé operaci informován výpisem do terminálu.

Úkol 8:
Zkopírujte soubor welcome.html z předchozího úkolu na soubor index.html, ten přejmenujte na main.html a poté tento smažte (s volbami postupně -i s odpovědí ne na výmaz a -f). Zkopírujte adresář public_html na adresář web a poté tento smažte.

Přenos souborů na/z linuxového serveru – scp

Spolu s programem ssh pro vzdálené připojení k linuxovému serveru v textovém terminálu bývá typicky distribuován i program scp (secure copy) pro kopírování souborů a adresářů na/ze vzdáleného unixového serveru. Jeho základní použití je stejné jako u cp, včetně přepínače -r, jen pro zadání cesty na vzdáleném serveru před ni přidáme síťové jméno serveru, případně i s uživatelským jménem (login) stejně jako u SSH klienta ssh, oddělené od cesty : (dvojtečkou), tedy ve tvaru login@server:cesta. Aktuálním adresářem (pro relativní cestu) na serveru po připojení na něj je domovský adresář uživatele na serveru a tento je také výchozí, pokud není za : uvedena žádná cesta. Se samotným připojením na server (přihlášením, zadáním hesla) je to stejné jako u ssh, akorát pokud není u cesty na vzdálený server zadaná část login@, výchozí je jméno (login) uživatele, který program spouští, a jméno se nezadává. Například tedy pro linuxový server phoenix.inf.upol.cz příkaz scp login@phoenix.inf.upol.cz:public_html/welcome.html . zkopíruje (stáhne, download) soubor welcome.html v podadresáři public_html domovského adresáře uživatele jménem login ze serveru do aktuálního adresáře na místním systému. Naopak pro kopii z místního systému na server (nahrání, upload) bude cesta na serveru (se jménem serveru) zadaná jako poslední argument.

Úkol 9:
Pomocí programu scp zkopírujte soubor welcome.html z předchozího úkolu pod svým uživatelským jménem na server phoenix.inf.upol.cz do souboru /tmp/login.html (kde login je vaše uživatelské jméno) a poté tento soubor zkopírujte zpět ze serveru do adresáže /tmp na místním systému.

Vyhledávání souborů a adresářů

Různé možnosti vyhledávání souborů a adresárů poskytuje v unixových systémech program find. Jako první argument (až na některé přepínače) mu zadáváme cestu k adresáři, ve kterém má vyhledávat (tj. v jeho obsahu, adresářovém podstromu), jako další argumenty potom testy (kritéria), podle kterých má vyhledávat. Jeho výchozím výstupem do terminálu jsou cesty (relativní k zadanému adresáři) k nalezeným souborům nebo adresářům vyhovujícím zadaným testům. Pro možné testy viz manuálovou stránku programu, man find, testy se zadávají ve tvaru přepínačů (název testu za -) s hodnotou: -test hodnota. Například pomocí find . -name vzor můžeme v aktuálním adresáři vyhledat soubory nebo adresáře, jejichž jméno odpovídá vzoru (o vzorech shellu pro jména si řekneme v šestém cvičení), kde jednoduchý vzor je obyčejný textový řetězec (bez speciálních znaků *?[] pro vzor). Varianta -iname vzor nerozlišuje u vzoru/jmen velikost písmen. Test -size velikost je pro velikost souboru, číselná hodnota velikost může mít příponu k, M, G pro 1024-násobky bytů a c pro byty (pozor, ne b, to je pro 512 bytů a je výchozí bez přípony). Velikost souboru musí odpovídat přesně zadané hodnotě, což obvykle nechceme, proto před ni můžeme zadat i znaky - (mínus) pro hodnotu/velikost i menší a + (plus) pro i větší. Podobně je to například i s testem -mtime dní pro čas poslední změny obsahu souboru (nebo adresáře), jehož hodnotou je počet dní do minulosti od aktuálního času (tedy větší hodnota znamená více do minulosti). Existují i testy -mmin minut pro hodnotu v minutách nebo -atime/-amin pro čas posledního přístupu k souboru. Nebo můžeme testovat (obyčejný) soubor, testem -type f, nebo adresář, -type d. Další testy jsou třeba pro uživatelská práva souboru/adresáře nebo uživatele jako jeho vlastníka, ale tyto záležitosti si představíme až v příštím pátém cvičení. Více zadaných testů musí být splněných současně (konjunktivně), ale mezi testy je možné úvést i přepínač -o (nebo -or) pro disjunktivní splnění testů nebo před testem uvést \! (-not) pro jeho negaci.

Úkol 10:
Vyhledejte všechny soubory ve vašem domovském adresáři větší než 1 kB a současně nezměněné dříve než jeden den zpět.

Dodejme ještě, že kromě testů můžeme programu find zadat jako argumenty i akce, které má s nalezenými soubory nebo adresáři rovnou provést. Například formátovaný výpis mnoha různých informací o nich (nejen cesty k nim, -printf formát), smazání (-delete) nebo rovnou vykonání libovolného příkazu nad nimi (-exec příkaz \;), ale zde už odkážeme na manuálovou stránku programu.

Cvičení 5


V pátém cvičení ještě zůstaneme u souborů a adresářů, budou nás zajímat hlavně uživatelská přístupová práva. Podíváme se ale také na používání výměnných diskových médií, např. USB flash disku, a vybrané zajímavé soubory a adresáře linuxových systémů.

Soubory a adresáře

Symbolický odkaz

Dalším, speciálním typem souboru, vedle běžného souboru a adresáře, je symbolický odkaz, soft link na soubor, adresář nebo i jiný odkaz (existuje ještě i tzv. pevný odkaz, hard link, ale ten vynecháme). Jeho "obsahem" je cesta (absolutní nebo relativní) k odkazovanému souboru, adresáři nebo jinému odkazu, přičemž samotný odkaz (jako speciální soubor) může být uložený kdekoliv jinde v celé adresářové struktuře. Vytvoříme jej pomocí programu ln s přepínačem -s (bez něj by se vytvářel pevný odkaz): ln -s cíl odkaz, kde cíl je odkazovaná cesta (cíl odkazu) a odkaz je cesta k odkazu (typicky jen jméno, tj. v aktuálním adresáři) – pokud není zadaná, bude vytvořený odkaz stejného jména jako cíl v aktuálním adresáři. V zobrazení (výpisu) obsahu adresáře programem ls můžeme odkaz poznat tak, že jeho jméno může být obarvené, typicky azurově, nebo v případě použití přepínače -l je u zobrazení odkazu první znak prvního sloupce (typ položky) znak l a za jménem odkazu je doplněno -> následované cestou k cíli odkazu.

Odkaz je, ve spojení s faktem, že může být v adresářové struktuře umístěný jinde než jeho cíl, užitečný v tom, že při souborových operacích čtení (např. programem cat) a zápisu (např. textovým editorem) aplikovaných na odkaz (stejně jako na soubor) se operace provádí s cílem odkazu a ne s odkazem samotným. Další takovou operací je změna uživatelských práv níže (odkaz má vždy "nastavena" plná práva). Ovšem operace kopie (např. programem cp), přesunu (přejmenováním, mv) a mazání (rm) se již provádějí se samotným odkazem (jako se souborem)! Zajímavá je situace, kdy neexistuje cíl odkazu, například v důsledku jeho přesunu nebo smazání (odkaz může být i rovnou vytvořený na neexistující cíl). Samotný odkaz existuje dál a je tzv. rozbitý (broken). V zobrazení (výpisu) ls může být takový odkaz obarven červeně a stane se opět "funkčním" ve chvíli, kdy jeho cíl bude opět existovat.

Úkol 1:
Vytvořte symbolický odkaz index.html na kopii souboru welcome.html z
předchozího cvičení, zobrazte obsah kopie "přes odkaz", kopii pak smažte, opět vytvořte a pak smažte odkaz. Mezi těmito kroky si zobrazte obsah adresáře s odkazem s podrobnějšími informacemi (o odkazu).

Uživatelská přístupová práva

Ke každému souboru nebo adresáři (i odkazu) je v unixových systémech přidružený uživatel, jako vlastník, typicky ten, který soubor nebo adresář vytvořil, a uživatelská skupina (typicky tzv. primární skupina vlastníka). Zatímco vlastníka může změnit jen superuživatel root, skupinu u souboru nebo adresáře může změnit i jeho vlastník, ovšem pouze na skupinu, jejímž je sám členem, např. programem chgrp. Seznam jmen skupin, jejichž je uživatel členem, získáme třeba programy groups nebo id (bez argumentu pro uživatele, který program spouští, jinak s argumentem jména uživatele). Vlastníka a skupinu každého souboru a adresáře vidíme u zobrazení ls -l ve třetím a čtvrtém sloupci, před údajem o velikosti. Druhý sloupec vynecháme, v prvním sloupci, vyjma prvního znaku udávajícího typ položky (viz předchozí cvičení), jsou vyjmenována uživatelská práva k položce.

Úkol 2:
Zobrazte skupiny, do kterých (váš) uživatel patří, a obsah nějakého adresáře s informacemi o vlastnících, skupinách a právech souborů a podadresářů.

Tzv. tradiční unixová přístupová práva jsou u souborů a adresářů evidována pro tři kategorie uživatetelů: vlastníka, (ostatní) uživatele z přidružené uživatelské skupiny a všechny ostatní uživatele (je možná i pokročilejší evidence pro více konkrétních uživatelů a skupin, podle seznamů ACL, ale těmi se nebudeme zabývat). Samotná (základní) práva jsou čtení, zápis a spouštění (pro což je potřeba i právo čtení) – to je význam pro soubory. Pro adresáře právo čtení znamená zobrazení obsahu adresáře, tj. seznamu jmen jeho souborů a podadresářů, právo zápisu změnu tohoto obsahu, tj. vytváření, přesun (přejmenování) a mazání položek seznamu a právo spouštění pak pro adresáře znamená vstup do adresáře – to je ovšem potřeba pro jakoukoliv manipulaci se soubory a podadresáři adresáře, tedy jejich čtení, zápis (včetně vytvoření, přesunu a smazání), spouštění i jen zobrazení dalších informací k nim. V zobrazení ls -l jsou práva v prvním sloupci (za prvním znakem) zapsána třemi trojicemi znaků pro právo čtení (znak r, read), zápisu (w, write) a spouštění (x, execute) postupně pro vlastníka, skupinu a ostatní. Pokud právo není nastaveno, je zde místo odpovídajícího znaku znak - (pomlčka).

Pro změnu práv u souboru nebo adresáře je program chmod. Jeho prvním (nepřepínačovým) argumentem je specifikace práv a dalšími argumenty pak cesty k souborům a/nebo adresářům, u kterých práva chceme nastavit. Specifikace práv je možná dvojí, symbolická a číselná. Symbolická je ve tvaru kategorieoperacepráva (bez mezer) a těchto zadání může být uvedeno víc oddělených , (čárkou, bez mezer). Kategorie je žádný a více znaků u (user) pro vlastníka, g (group) pro skupinu, o (other) pro ostatní nebo a (all) pro všechny uživatele – tato kategorie je výchozí, pokud není zadána žádná, operace je jeden ze znaků + (plus) pro přidání práv, - (mínus) pro odebrání práv nebo = pro (absolutní) nastavení pouze zadaných práv a (základní) práva jsou buď žádný a více znaků r pro čtení, w pro zápis nebo x pro spouštění (ještě i X pro vstup do adresáře nebo u souboru již je právo spouštění pro nějakou kategorii uživatelů) anebo jeden ze znaků u, g, o pro práva taková, jaká jsou již nastavena pro danou kategorii uživatelů. Číselná specifikace (základních) práv je jednodušší (a omezenější), jedna až tři číslice od 0 do 7 (počáteční chybějící číslice jsou uvažovány 0) postupně pro kategorie uživatelů vlastník, skupina a ostatní. Každá číslice je součet hodnot 4 pro právo čtení, 2 pro právo zápisu a 1 pro právo spouštění (tedy např. hodnota 6 je dohromady pro práva čtení a zápisu), a práva jsou nastavena vždy pouze takto zadaná (absolutně).

Úkol 3:
Odeberte souboru welcome.html z prvního úkolu právo zápisu vlastníkovi a zkuste do něj zapsat (např. textovým editorem), odeberte právo čtení a zkuste zobrazit jeho obsah, poté práva souboru vraťte.

Úkol 4:
Odeberte adresáři public_html z předchozího cvičení právo vstupu všem uživatelům a zkuste zobrazit jeho obsah a vstoupit do něj, poté právo vraťte a odeberte právo čtení a opět zkuste zobrazit jeho obsah a vstoupit do něj, pak opět právo adresáři vraťte.

Úkol 5:
Nastavte všechna práva vlastníkovi a pouze právo vstupu skupině a ostatním uživatelům adresáři public_html z předchozího úkolu.

Kromě zmíněných základních práv (čtení, zápis a spouštění) existují ještě speciální práva (někdy označovaná jako bity): tzv. set user ID (on execution, SUID), set group ID (SGID) a restricted deletion flag či sticky bit podle užití pro adresář či soubor. V zobrazení ls -l je poznáme podle písmene s místo x pro právo spouštění pro vlastníka (SUID) nebo skupinu (SGID), resp. písmene t pro ostatní (flag/sticky). Stejná písmena by se použila u programu chmod pro jejich nastavení. Jejich význam vynecháme (je spíše technický a někdy i nebezpečný), ukážeme si jen význam práva restricted deletion flag u adresáře: při nastaveném zmemožňuje přejmenování nebo smazání souboru nebo podadresáře adresáře komukoliv jinému (s výjimkou superuživatele root) než vlastníkovi tohoto souboru nebo podadresáře, případně samotného adresáře. Typicky bývá toto právo nastaveno u všeobecně (pro všechny uživatele) zapisovatelného adresáře /tmp pro dočasné soubory uživatelů.

– Úkol 6:
Zkuste v adresáři /tmp vytvořit soubor a smazat cizí soubor (jehož váš uživatel není vlastníkem; cizí soubor může jiný uživatel vytvořit např. na serveru phoenix.inf.upol.cz po svém vzdáleném připojení pomocí ssh).

Připojování souborových systémů

V unixových systémech se obsah, adresářová struktura, souborových systémů z diskových zařízení, včetně např. výměnných diskových médií, připojuje (mount) pod nějaký adresář v (jednom) adresářovém stromu systému, tzv. přípojný bod. Při připojení dojde k překrytí původního obsahu adresáře a po odpojení (unmount) zase k odkrytí; proto se typicky připojuje do prázdných, případně nově vytvořených, adresářů. Připojování obsahu souborových systémů z trvale v počítači přítomných diskových zařízení (disků) je typicky záležitostí konfigurace systému, zaměříme se tedy na výměnná disková média používaná uživateli, např. USB flash disky, optické disky nebo paměťové karty. V moderních grafických prostředích (např. desktopu Gnome v linuxu) dojde při aktivaci média (zasunutím do konektoru, mechaniky, slotu apod.) k automatickému připojení obsahu média, v linuxu obvykle do adresáře (přípojného bodu) /media/login/jméno-média, kde login je uživatelské jméno a jméno-média je jméno souborového systému na médiu (nebo jednoduše média). V Apple MacOS je přípojný bod adresář /Volumes/jméno-média. Pokud k tomu nedojde, je obvykle možné připojení (třeba jen pokusem o zobrazení) obsahu média v prohlížeči souborů (grafickém, např. v aplikaci Soubory, v Apple macOS Finder), ve kterém se médium objeví. Zde i můžeme získat informaci o celkové, obsazené a volné kapacitě média, ale v prostředí textového terminálu k tomu můžeme využít program df, ideálně rovnou s přepínačem -h: df -h, který zobrazuje tabulku pro (téměř) všechny připojené souborové systémy (v posledním sloupci tabulky jsou zobrazeny přípojné body).

Odpojení obsahu média i média ze systému jako takového, po ukončení práce s ním, provedeme nejjednodušeji opět v prohlížeči souborů, například kliknutím na ikonu "eject" vedle pojmenování média (nebo cesty přípojného bodu), podobně jako v případě síťového disku ve druhém cvičení. POZOR: Pro operace se soubory, zvláště déletrvající (při větší velikosti souboru), se v unixových systémech intenzivně používají paměťové buffery, takže typicky operace zápisu může být systémem (programem, aplikací) oznámena jako provedená, ale skutečný zápis na cílové médium v té chvíli ještě nemusí být dokončen! Prohlízeč souborů (nebo jiná aplikace) by sice v takovém případě neměla odpojení cílového média dokončit (a oznámit, že je možné médium bezpečně fyzicky odpojit, vytáhnout apod.), ale pro jistotu je před odpojením média doporučeno vynutit dokončení všech operací s ním například programem sync a médium odpojit až po ukončení běhu tohoto programu.

V linuxu, pokud k automatickému připojení obsahu média nedojde a/nebo ho nechceme připojovat v (grafickém) prohlížeči souborů, můžeme pro připojení a odpojení použít příkazy udisksctl mount -b /dev/soubor-média, resp. udisksctl unmount -b /dev/soubor-média, což je novější možnost připojení pod stejný připojovací bod jako výše (/media/login/jméno-média), nebo starší příkazy pmount /dev/soubor-média, resp. pumount /dev/soubor-média (ano, bez n v pumount), v tomto případě pod připojovací bod /media/soubor-média. Zde soubor-média je jméno speciálního souboru systému pro médium, které získáme např. programem lsblk (případně i s přepínačem -f pro informaci o souborovém systému na médiu) zobrazujícím v tabulce informace o všech diskových médiích – jméno soubor-média, např. sdb1, je zobrazeno v prvním sloupci.

Úkol 7:
Připojte k počítači USB flash disk a zobrazte si jeho obsah a informaci o celkové, obsazené a volné kapacitě (programem df). Poté disk bezpečně (!) odpojte.

Zajímavé soubory a adresáře

Podívejme se ještě na závěr na pár vybraných zajímavých souborů a adresářů v unixových systémech. V adresáři /dev je spousta speciálních souborů jako rozhraní k hardware nebo pro nějaký účel. Například v linuxu již zmíněné sdxn (a symbolické odkazy na ně např. z /dev/disk), kde x je znak a a dál v abecedě a n je číslo, pro disková média (písmeno) a jejich oblasti (číslo), nebo třeba null je tzv. "černá díra", do tohoto souboru můžeme zapsat libovolné množství dat a všechna se nenávratně ztratí (číst není možné nic), nebo random a urandom jako rozhraní pro generátory pseudonáhodných dat.

V adresáři /etc jsou umístěné systémové (textové) konfigurační soubory. Například ve všem čitelném souboru passwd jsou evidovány informace o uživatelských účtech (login, ID, ID primární skupiny, plné jméno, cesta k domovskému adresáři a výchozí shell), ovšem ne hesla uživatelů. Ta, resp. jejich kryptografický hash, jsou (v linuxu, ne Apple macOS) v souboru shadow, který je již čitelný pouze superuživateli root.

Valná většina souborů systému a nainstalovaných programů a aplikací je uložená v adresáři /usr. Například v podadresáři share/man jsou všechny manuálové stránky a v podadresáři share/doc další dokumentace programů a aplikací, typicky v podobě textových souborů nebo webových stránek (zkusme du -sh /usr/share/doc).

V podadresářích adresáře /home, v Apple macOS /Users, jsou domovské adresáře uživatelů, ovšem domovský adresář superuživatele root je v adresáři /root (ne v Apple macOS; není ostatním uživatelům přístupný). Pod podadresáře adresářů /media a /mnt se typicky připojují obsahy jiných souborových systémů mimo vlastní systém, např. z výše rozebíraných výměnných diskových médií (/media) nebo trvale v počítači přítomných diskových zařízení (/mnt). V Apple macOS se vše připojuje pod podadresáře adresáře /Volumes. Výše zmíněný adresář /tmp mohou uživatelé a programy využít pro odkládání dočasných souborů (obsah obvykle "nepřežije" restart systému).

Zajímavé technické (a detailní) informace o systému, spuštěných programech a hardware počítače lze získat ze souborů v adresáři /proc (ne v Apple macOS), a v linuxu ještě i adresáři /sys. Na obsahu těchto adresářů je zajímavé také to, že je zcela generovaný systémem (jádrem), včetně obsahu souborů, na požadavek čtení a obsah není nikde uložený. Soubory zde mají typicky nulovou nebo nějakou fixní velikost, až na výjimky jako například /proc/kcore (tento soubor poskytuje náhled na celou tzv. virtuální paměť systému). Podívejme se např. na obsah souborů /proc/cpuinfo (viz také v linuxu program lscpu) a /proc/meminfo (lsmem) s detailními informacemi o procesoru (CPU) a paměti (RAM) počítače.

Cvičení 6


V šestém cvičení se přesuneme od souborů a adresářů k, v první části, procesům jako spuštěným programům, zobrazení informací o nich a jejich ukončování, a ve druhé části se začneme více zabývat samotným příkazovým interpretem, shellem (GNU Bash), konkrétně řízením úloh v něm a expanzí cest k souborům a adresářům.

Procesy

Proces je v operačních systémech aktivní entita reprezentující spuštěný program. Program může pro svoji činnost používat i více procesů, obvykle ale ke každému spuštěnému programu existuje v systému jeden proces. Říkáme, že "program nebo proces běží pod uživatelem", typicky tím, který ho spustil (systémové procesy beží pod superuživatelem root). Procesy jsou v unixových systémech, podobně jako soubory a adresáře, organizovány hierarchicky do jediného stromu, s kořenem procesem programu init spouštěném jádrem systému při jeho startu. Každý další proces je spouštěn jako potomek svým rodičovským procesem a každý proces má svoje číslo PID.

Zobrazení informací o procesech

Základním programem pro zobrazení (výpis) informací o procesech je v textovém terminálovém prostředí program ps. Bez argumentů zobrazuje jen procesy (informace o nich) spuštěné v shellu, ve kterém je ps spuštěn, tedy například jen procesy programů bash (pro shell GNU Bash) a ps. Procesy jsou na řádcích zobrazené tabulky, ve sloupcích (se záhlavím na prvním řádku) jsou informace o nich, jako např. PID, souhrnný čas běhu procesu (TIME, přesněji souhrnný čas využívání procesoru procesem – POZOR: není totéž jako doba od spuštění procesu doteď!) nebo jméno programu procesu (CMD). Argumenty programu ps jsou trojí: tzv. BSD, jednopísmenné nezačínající - (pomlčkou), unixové, jednopísmenné začínající - (tj. klasické přepínače) a GNU, (dlouhé) slovní začínající dvěma -. Možnosti těchto sad argumentů se značně překrývají, budeme používat první dvě (a typicky se nekombinují argumenty z různých sad).

Přidáním argumentu x zobrazíme všechny procesy uživatele, který ps x spouští. Navíc místo pouze jména programu je zobrazen celý příkaz jeho spuštění, včetně argumentů (sloupec COMMAND). Spolu s a, dohromady ps ax, jsou pak zobrazeny všechny procesy v systému, všech uživatelů. Podobně funguje i ps -e (jen jsou zobrazena jen jména programů, ne celé příkazy). Další informace jako uživatelské jméno (USER, uživatele, pod kterým proces běží), procento využití procesoru (%CPU, podíl času běhu procesu a doby od jeho spuštění), procento využití operační paměti RAM (%MEM) nebo datum nebo čas spuštění procesu (START nebo STIME) získáme argumentem u nebo -f: oblíbené ps aux nebo ps -ef. Pro zobrazení vztahu rodič-potomek mezi procesy, ve sloupci se jménem programu nebo příkazem, je argument f nebo -H (ne v Apple macOS). Můžeme si i zvolit informace (sloupce), které o procesech chceme zobrazit, (posledním sloučeným) argumentem o názvy nebo -o názvy, kde názvy jsou čárkou oddělená klíčová slova pro informace, např. pid pro PID, cmd pro příkaz (command v Apple macOS), %cpu pro využití procesoru apod. (kompletní seznam najdeme v manuálové stránce programu ps), např. ps axo pid,%cpu,cmd nebo ps -eo pid,%cpu,cmd. Dále například pomocí -C jména (ne v Apple macOS) omezíme zobrazení jen na procesy se jménem programu ze seznamu (jmen oddělených čárkou), pomocí U jména nebo -u jména na procesy běžící pod uživatelem, pro další možnosti již odkážeme na manuálovou stránku man ps.

Celou stromovou hierarchii všech procesů v systému můžeme zobrazit pomocí pstree (ne v Apple macOS). Přidáním argumentů -a nebo -p doplníme zobrazení příkazů (nejen jmen programů) nebo PID procesů, například.

Úkol 1:
Zobrazte výpis všech procesů Vašeho a jiného uživatele, všechny procesy v systému, dále ve stromové struktuře a nakonec pouze s informací o PID a příkazu procesu.

Informace o procesech si můžeme v textovém prostředí nechat zobrazovat i interaktivně, přes celou obrazovku terminálu. Klasickým starším programem top, nebo v linuxu novějším htop. Po spuštění, top zobrazuje v horní části obrazovky na prvním řádku informace o době běhu systému a jeho akuálním vytížení (stejně jako program w) a na dalších řádcích různé počty procesů (Tasks) a informace o celkovém vytížení procesoru a využití operační paměti (a tzv. odkládacího prostoru, swap). Tyto údaje jsou periodicky aktualizované, stejně jako celá hlavní tabulka s procesy ve zbytku obrazovky – s podobnými výchozími informacemi (sloupci) jako v případě ps aux. Program ovládáme klávesami písmen nebo jinými, z nichž některé si představíme. Tabulkou můžeme posouvat doleva a doprava i nahoru a dolů klávesami šipek, PageUp a PageDown a Home a End. Klávesou x přepneme zvýraznění (tučně) sloupce, podle kterého jsou procesy aktuálně setřízeny (výchozí je využití procesoru, %CPU), klávesami P, M a T přímo volíme setřízení podle sloupce využití procesoru (%CPU), operační paměti (%MEM) a času běhu procesu (TIME), pomocí < a > pak měníme sloupec určující setřízení na sousední (v Apple macOS se sloupec volí klávesou o) a klávesou R setřízení převrátíme. Přes f si můžeme vybrat informace (sloupce), které v tabulce procesů chceme mít zobrazené (obrazovka výběru obsahuje nahoře nápovědu k ovládání). Klávesami c a V přepneme zobrazení pouze jména programu procesu nebo celého příkazu, resp. vztahů rodič-potomek mezi procesy (sloupec COMMAND), pomocí u (v Apple MacOS U) můžeme omezit zobrazení jen na procesy následně zadaného uživatele (žádného pro všechny, zrušení pomocí Esc) a po k (v Apple macOS S) můžeme ukončit (přesněji zaslat mu signál, viz dále) proces s daným PID. Přes klávesu L můžeme v tabulce vyhledat proces se zadaným řetězcem v názvu programu. Klávesami l, t, m nebo 1 různě měníme zobrazení informací nad tabulkou procesů a přes d (v Apple macOS s) můžeme změnit interval aktualizace všech údajů. Konečně pod klávesami h nebo ? se skrývá nápověda s přehledem všech ovládacích kláves a program ukončíme stiskem q.

Linuxový program htop má zobrazení i ovládání velice podobné programu top, na první pohled viditelný rozdíl je ovšem v použití barev v zobrazení údajů. Zmíníme se jen o rozdílech v ovládání. Klávesy ↑ a ↓ neposouvají celou tabulkou s procesy, nýbrž označením (barevným pruhem přes celý řádek) vybraného procesu. U sloupce, podle kterého jsou procesy aktuálně setřízeny, je zvýrazněno (barvou) jen jeho záhlaví trvale (klávesa x je pro něco zcela jiného), sloupec určující setřízení měníme zvolením sloupce v nabídce (klávesami ↑, ↓ a Enter) po stisku nejen < a >, ale také . nebo , (nebo i F6, SortBy – v posledním řádku obrazovky jsou vždy zobrazeny aktuální ovládací klávesy) a setřízení převracíme klávesou I. Výběr informací (sloupců), které v tabulce procesů chceme mít zobrazené, zahájíme stiskem S (nebo F2, Setup) a poté klávesami šipek vybereme v nabídkách položky Screens a Main a následně sloupce (nabídky poskytují i nastavení celého programu). Klávesa c (a mezerník a U) slouží k označování více procesů, zobrazení vztahů rodič-potomek mezi procesy přepneme pomocí t (nebo F5, Tree). Vyhledání procesu v tabulce se zadaným řetězcem v názvu programu zahájíme klávesou / (nebo F3, Search), je možné i omezit zobrazení v tabulce jen na tyto procesy přes \ (nebo F4, Filter). Zobrazení informací nad tabulkou procesů změníme v rámci nastavení přes S (nebo F2, Setup), položky Header layout a Meters (také je možné toto zobrazení vypnout pomocí #), interval aktualizace všech údajů nastavíme tamtéž, v Display options. Oproti programu top můžeme mít navíc více tabulek s různými informacemi o procesech a přepínat mezi nimi klávesou Tab, zbývající klávesy P, M, T, u, k (nebo F9, Kill), h (F1, Help) a q (F10, Quit) mají stejnou funkci jako u top.

Ukončení procesu

Uživatel může, vedle spouštění programů s vytvořením procesů, programy a jejich procesy i "násilně" nebo "nekorektně", mimo funkci programu, ukončovat. Samozřejmě jen takové, které "mu patří" (běží pod uživatelem; s výjimkou spueruživatele root, ten může ukončovat kterýkoliv proces kteréhokoliv uživatele). Základním nástrojem pro to je program kill, kterému zadáme jako argumenty PID procesů k ukončení: kill PID. To získáme buď pomocí ps nebo top (htop) výše, nebo i pomocí programu pidof, kterému jako argument předáme jméno programu (ne v Apple macOS). Z technického hlediska, kill zasílá procesu tzv. signál, který mu lze zadat formou přepínače: -signál (nebo i -s signál), kde signál může být jméno signálu (i s prefixem SIG) nebo jeho číslo, a účelem (akcí) signálu ve skutečnosti nemusí být jen ukončení procesu. Signálů je víc, jejich přehled poskytuje kill -l (a detailní popis man 7 signal), výchozí pro kill je TERM (číslo 15). Jeho účelem je ukončení procesu, stejně jako u signálu KILL (9), který je v tom "účinnější", pokud proces z nějakého důvodu není možné "normálně" ukončit. Účelem signálů STOP (19) a CONT (18) je ale zastavení a znovurozběhnutí procesu – zastavení procesu neznamená jeho ukončení, ale "zmrazení" (nebude vykonáván procesorem), viz také dále řízení úloh v shellu. Vyzkoušejme si to například na jakékoliv grafické aplikaci, nejlépe spuštěné v terminálu, např. (v desktopu Gnome) Kalkulačka jako program gnome-calculator (v Apple macOS příkaz open -Wa Calculator). Po získání PID jeho procesu (v jiném terminálu), po kill -STOP PID bude aplikace "zamrznutá" (v Apple macOS ne; ale interakce s ní, např. myší, bude evidována) a po kill -CONT PID se opět "rozběhne" (a interakce se provede).

Podobný programu kill je program killall, jen s tím rozdílem, že místo PID mu zadáváme jména programů a on zašle signál všem procesům programů s těmito jmény. Přepínačem -u jméno-uživatele (bez zadání jmen programů) můžeme také jednoduše zvolit všechny procesy daného uživatele (což je užitečné zejména pro superuživatele root).

Při ukončení procesu, "korektně" jeho funkcí nebo i "nekorektně" signálem, jsou v unixových systémech standardně ukončeni (signálem) i všichni jeho potomci v rámci stromu procesů. Například při odhlášení uživatele chceme ukončit všechny programy spuštěné v shellu nebo grafickém desktopu v rámci uživatelova sezení (session) – s ukončením jejich procesu jsou tedy ukončeny i procesy těchto programů jako jejich potomci. Program ale může "zařídit", že se toto u jeho procesů dít nebude a ve skutečnosti to tak mají programy shellů (včetně GNU Bash), pokud jsou ukončeny "korektně". Jejich rodičem ale bývá program emulátoru terminálu a ten už to tak nemá (tj. jeho potomci jsou vždy ukončeni). Demonstrujme si to opět např. na aplikaci Kalkulačka, programu gnome-calculator spuštěném v shellu v emulátoru terminálu. Při ukončení emulátoru terminálu, např. zavřením jeho okna, se ukončí ("nekorektně") nejen shell v něm (jako potomek procesu terminálu), ale i aplikace (jako potomek procesu shellu). Ovšem při "korektním" ukončení shellu, např. příkazem exit, se sice ukončí i emulátor terminálu (protože tento se bez shellu automaticky ukončuje, ne v Apple macOS), ale aplikace poběží dál (!) – toto ale můžeme vyzkoušet až poté, co se níže v rámci řízení úloh v shellu dozvíme, jak po (obyčejném) spuštění programu v shellu "vrátit" terminál zpět shellu pro možnost opět zadávat příkazy v příkazovém řádku, zatímco program běží dál.

Úkol 2:
Spusťte, v příkazovém řádku v terminálu, (grafický) program gnome-calculator, ve druhém terminálu získejte PID jeho procesu, programem kill jej zastavte (poté ho zkuste ovládat), pak znovurozběhněte a nakonec ukončete. Spusťte jej poté znovu, opět z terminálu, a zavřete okno terminálu.

Doba běhu příkazu

Dodejme stručně, že můžeme zjistit i dobu běhu příkazu (programu a jeho procesu) a to tak, že před příkaz v příkazovém řádku shellu doplníme program time: time příkaz. Jsou zobrazeny tři časy: skutečná doba běhu příkazu (real), doba vykonávání kódu programu (user) a doba vykonávání kódu (jádra) systému v kontextu procesu (sys).

Příkazový interpret (shell)

Nyní se již přesuneme zpět k samotnému příkazovému interpretu, shellu (GNU Bash), jehož základní ovládání skrze příkazový řádek jsme si ukázali ve třetím cvičení, a ukážeme si, co dalšího nám nabízí.

Řízení úloh

Podobně jako proces na systémové úrovni reprezentuje spuštěný program, spuštěný příkaz shellu, po jeho potvrzení na příkazovém řádku ("odeslání" shellu k vykonání), je reprezentován úlohou shellu. Narozdíl od procesů ale úlohy shellu nejsou hierarchicky organizovány, není mezi nimi vztah rodič-potomek, a jsou evidovány v rámci každého shellu (v každém emulátoru terminálu) zvlášť pod svým číslem úlohy job ID. Úloha shellu může být vykonávána, neboli příkaz či program může v shellu běžet, tzv. na popředí (foreground) nebo na pozadí (background). Vykonávání úlohy na popředí znamená, že shell předá příkazu (programu) vstup i výstup terminálu, tzn. možnost skrze terminál uživateli zadávat příkazu (textová) data i do terminálu data příkazem zobrazovat. Po dobu vykonávání příkazu není v terminálu dostupný příkazový řadek s promptem shellu pro zadávání dalšího příkazu a shell do terminálu nic nezobrazuje, dokud příkaz neskončí. Oproti tomu při vykonávání úlohy na pozadí shell pouze "propůjčí" příkazu (programu) výstup terminálu. Sám může do terminálu také zobrazovat (textová) data, ale ponechává si vstup terminálu s promtem v příkazovém řádku pro zadávání dalších příkazů. Mezitím je příkaz (program), bez možnosti mu zadávat skrze terminál data, vykonáván (běží) "na pozadí" shellu a současně s ním může být vykonáván další v shellu zadaný příkaz (na popředí i na pozadí).

Obyčejné spuštění příkazu doteď bylo vždy na popředí. Spuštění příkazu rovnou na pozadí se provede jednoduše přidáním znaku & (ampersand) na konec příkazu (často ještě s mezerou před). Například příkaz gnome-calculator & (v Apple macOS open -Wa Calculator &) spustí aplikaci Kalkulačka, jejíž úloha bude v shellu vykonávána (příkaz/program poběží a může něco zobrazovat v terminálu) na pozadí a v shellu zůstane dostupný příkazový řádek s promptem pro zadání dalšího příkazu. Při takovém spuštění úlohy shell zobrazí v terminálu ID úlohy (jako [job ID]) a PID procesu aplikace a po skončení úlohy, po zadání dalšího příkazu (i prázdného), zobrazí informaci o dokončení úlohy. Všechny úlohy shellu (job ID a příkaz) vykonávané na pozadí si můžeme nechat zobrazit příkazem jobs, případně s přepínačem -l pro zobrazení i PID procesů.

Úlohu spuštěnou (obyčejně) na popředí je možné dodatečně "přepnout" na pozadí a obráceně. Jelikož úloha vykonávaná na popředí má i vstup terminálu, musíme ho nějak "vrátit" shellu a jeho promptu v příkazovém řádku. Toho docílíme klávesou zkratkou C-z, což způsobí zastavení úlohy (procesu, signálem STOP, viz výše) a shell o tom informuje. Následně můžeme zadat příkaz bg pro znovurozběhnutí úlohy (procesu, signálem CONT) na pozadí (shell o tom opět informuje). Obráceně, když úloha vykonávaná na pozadí nemá vstup terminálu a je zde prompt shellu, můžeme rovnou zadat příkaz fg pro "přepnutí" úlohy na popředí. Bez argumentu identifikujícího úlohu (nebo s argumentem % nebo %%) příkazy uvažují poslední zastavenou úlohu (bg) nebo poslední úlohu spuštěnou nebo znovurozběhnutou na pozadí (fg). Jinou úlohu je možné zadat jejím číslem job ID (jen číslo nebo za znak %) nebo i začátkem nebo obsahem příkazu, pomocí %prefix nebo %?obsah.

Podobně jako procesy můžeme ukončovat "nekorektně" programem kill, můžeme ukončovat "nekorektně" ("násilně") i úlohy shellu. Ovšem jen, pokud je úloha vykonávána na popředí, a to klávesovou zkratkou C-c (což znamená zaslání procesu úlohy signálu INT (2), v Apple macOS ukončí příkaz open, ne aplikaci přes něj spuštěnou). Samotný shell takto ale neukončíme.

Úkol 3:
Spusťte, v příkazovém řádku v terminálu, (grafické) programy gnome-calculator a gnome-mines, první tzv. na pozadí a druhý tzv. na popředí. Druhý přesuňte na pozadí a první na popředí. Pak první ukončete (zavřete jeho okno) a "korektně" ukončete shell v terminálu (např. příkazem exit).

Expanze cest

Pro zadání cest, jako argumentů příkazů, k více souborům nebo adresářům, jejichž jména mají nějaké části společné, můžeme s výhodou využít vzorů (patterns) pro zadání těchto jmen a zadat tak cestu jen jednu se vzorem. Shell takovou cestu automaticky, před spuštěním příkazu, expanduje ("rozbalí") na abecedně setřízený seznam cest (oddělených mezerou) s celými jmény na dané cestě existujících souborů a adresářů vyhovujících vzoru a nahrazenými místo vzoru. Ve vzorech lze využít následujících zápisů: * (hvězdička) pro jakýkoliv řetězec znaků (i prázdný), ? (otazník) pro jakýkoliv jeden znak a [znaky] pro jakýkoliv jeden znak z mezi [] vyjmenovaných znaků, a jejich kombinací. Místo vyjmenování znaků mezi [] lze také zapsat rozsah znaků od-do dle jejich (anglického) abecedního setřízení a znaky ^ (stříška) nebo ! (vykřičník) uvedené jako první za [ mění množinu znaků na doplňkovou do všech znaků (anglické) abecedy. Pokud žádná jména vzoru nevyhovují, cesta expandována není a zůstává i se vzorem.

Takže například samotná * (jako relativní cesta) je expandována na abecedně setřízeny seznam jmen všech v aktuálním adresáři existujících souborů a adresářů (jako seznamu relativních cest), /tmp/p*l na seznam (absolutních) cest ke všem souborům a adresářům v adresáři /tmp, jejichž jména začínají znakem p a končí znakem l (a mezi nimi je cokoliv, včetně ničeho), pokus?/vysledek.txt na seznam (relativních) cest k souborům vysledek.txt ve všech adresářích (v aktuálním adresáři), jejichž jméno je pokus následované jediným jakýmkoliv znakem, p[ou]* na seznam jmen všech souborů a adresářů (v aktuálním adresáři) začínajících řetězcem po nebo pu (a pak cokoliv) atd. Vzorů je možné v jedné cestě, místo více jmen, uvést i víc, například /home/p[^o-u]*/*.txt je rozbalená na seznam cest ke všem souborům (nebo adresářům) se jménem končícím na .txt ve všech podadresářích se jmény začínajícími na p a jakýkoliv znak kromě znaků o až u v adresáři /home.

Úkol 4:
Zobrazte seznam cest ke všem souborům v adresáři /dev se jménem ttycifra, kde cifra je 0 až 9, a se jménem začínajícím ttynecifra, kde necifra je jakýkoliv jeden znak mimo 0 až 9.

Užitečné mohou být i zkratky ~ (tilda) za absolutní cestu k domovskému adresáři uživatele (pod kterým shell běží), případně ~login pro uživatele jménem login, a ~+ a ~- za absolutní cestu k aktuálnímu a předchozímu aktuálnímu adresáři.

Kvótování

Viděli jsme, že některé znaky mají v shellu speciální význam, například v příkazu mezera, tabulátor, ; nebo &, a ve vzoru pro cestu *, ? a [ (a nakonec i ~ v použitích výše). Pokud chceme v příkazu nebo cestě zadat tyto znaky samotné, musíme jejich speciální význam potlačit a tzv. je kvótovat. Pro jeden znak před něj stačí dát \ (jak jsme již viděli ve třetím cvičení), pro více v řetězci je výhodnější celý řetězec uzavřít mezi ' (apostrofy) nebo " (uvozovky), např. echo '* &'. Tyto tři kvótovací znaky je opět potřeba kvótovat (typicky pomocí \), pokud chceme opět zadat je samotné. Takových znaků se speciálním významem je v shellu (GNU Bash) ještě víc, v příštím, sedmém cvičení, si jich představíme hned dalších šest, ostatní (obyčejné) znaky můžeme kvótovat také, ale nemusíme.

Úkol 5:
Vytvořte (v aktuálním adresáři) soubory, např. pomocí programu touch, se jmény *  *  * (včetně obou dvojic mezer mezi *) a "1 & 2" (včetně obou ").

Cvičení 7


V sedmém cvičení zůstaneme u příkazového interpretu, shellu (GNU Bash), a jeho bohatých možností a seznámíme se hlavně s přesměrováním vstupu a výstupu příkazů z a do terminálu a propojováním příkazů pomocí roury (pipe). Ke konci jsou pak představeny ještě základy používání proměnných, "podshellu" a (jednoduché) aritmetiky v shellu.

Příkazový interpret (shell)

Aliasy

Pokud nějaký příkaz, zvláště obsahující více argumentů, používáme často, může být výhodné si ho celý pojmenovat a pak ho spouštět zadáním tohoto jména. Tomu se říká alias a příkaz pro jeho vytvoření je rovněž alias. Jeho argumenty jsou ve tvaru jméno=příkaz, kde jméno je jméno vytvářeného (nebo měněného existujícího) aliasu a příkaz je dobré uvádět celý kvótovaný (obvykle v '), protože typicky obsahuje mezery jako speciální znak oddělující název příkazu nebo programu a argumenty, např. alias lsl='ls -l'. Při použití aliasu jako (jména) příkazu je mu možné předat další argumenty a v příkazu v definici aliasu může být jako jméno příkazu použito i jméno již existujícího aliasu, např. alias lsla='lsl -a', nebo dokonce i stejné jméno jako je jméno definovaného aliasu. Při potvrzení ("odeslání") příkazu shellu v příkazovém řádku, před jeho spuštěním, shell vždy případné aliasy jako jména v příkazu expanduje (nahradí jména za příkazy) a to opakovaně (rekurzivně, stejné jméno samozřejmě ne), takže např. příkaz lsla je (po vytvoření aliasů předchozími uvedenými příkazy) expandovaný na příkaz ls -l -a. alias bez argumentu zobrazí všechny v shellu definované aliasy (ve tvaru definic, s argumenty jen jmény aliasů zobrazí jen tyto) a pro zrušení aliasu je příkaz unalias jména. V konfiguračním souboru ~/.bashrc shellu GNU Bash již bývají (zejména v linuxových distribucích) nějaké aliasy připraveny, typicky "bezpečné" cp, mv a rm s přepínačem -i, což je nutné pro uchování aliasů i po ukončení aktuálního shellu (ve kterém byly definovány) pro další shelly v dalších terminálech.

Přesměrování vstupu a výstupu

Pokud shell beží v (emulátoru) terminálu, jsou vstup i výstup v něm spuštěných příkazů (programů) automaticky "navázány" na terminál, tj. příkaz může získávat i zobrazovat (textová) data prostřednictvím terminálu, viz řízení úloh v přechozím šestém cvičení. Tento vstup a výstup je však možné přesměrovat (redirect) ze, resp. do souboru, nebo v případě vstupu i z terminálu, ale se zadáním dat hromadně při spuštění příkazu nebo jako součásti příkazu v příkazovém řádku před jeho spuštěním (místo zadávání dat v terminálu interaktivně až ve chvíli, kdy si je příkaz/program vyžádá). Přesměrování vstupu příkazu ze souboru provedeme zápisem < soubor, kde soubor je cesta k souboru, uvedeným v rámci příkazu (kdekoliv na místě argumentů, ale typicky na konci příkazu), například cat < text.txt. Bez argumentu cesty k souboru totiž cat očekává vstup dodaný uživatelem, klasicky interaktivně skrze terminál, takto mu ho dodáme rovnou ze souboru (což je rozdíl oproti tomu, když si cat načte soubor zadaný jako argument sám). Přesměrování výstupu příkazu do souboru, místo zobrazení v terminálu, pak provedeme analogickým zápisem > soubor, například echo Ahoj > text.txt (ve skutečnosti je platným příkazem i jen > soubor "bez" příkazu, je to asi nejkratší příkaz pro vytvoření prázdného souboru). Toto případný obsah existujícího souboru text.txt celý přepíše, pro přidání výstupu příkazu za stávající obsah souboru použijeme >> místo >: echo Ahoj >> text.txt. Tato přesměrování, vstupu i výstupu, můžeme v jednom příkazu i použít současně, takže například cat < text.txt > kopie.txt vlastně vytvoří kopii souboru podobně jako program cp. Ovšem POZOR, současné přesměrování vstupu i výstupu nesmí být z a do toho samého souboru! – výsledkem by bylo jen vymazání obsahu souboru.

Úkol 1:
Uložte výstup programu date do souboru a pak do něj přidejte výpis všech procesů v systému.

Přesměrování vstupu příkazu z terminálu, ale se zadáním dat hromadně při spuštění příkazu, provedeme zápisem << značka. Po potvrzení příkazu bude shell očekávat (textová) data zapsaná do terminálu, za prompt > , i více řádků (ukončených běžně klávesou Enter), ukončená řádkem obsahujícím pouze řetězec značka – toto může být jakékoliv slovo (typicky řetězec písmen, např. obvyklé EOF). Až poté je příkaz spuštěn a zadaná data jsou mu předána na vstup. A do třetice, k přesměrování vstupu příkazu "z příkazového řádku", tj. kdy vstupní data jsou součástí příkazu před jeho spuštěním, slouží zápis <<< 'vstupní text', například cat <<< 'Ahoj' (apostrofy jsou zde k potlačení speciálního významu některých znaků, kvótování, typicky mezery).

Úkol 2:
Zapište do souboru, (pouze) pomocí programu cat, text zadaný na vstupu terminálu a poté ještě přidejte text zapsaný přímo v příkazovém řádku.

Výstup příkazů (procesů), směrovaný do terminálu, je ve skutečnosti dvojí: standardní a chybový (vstup je jediný, standardní). Standardní výstup je používaný pro data, která jsou výsledkem běžné činnosti příkazu (programu) nebo pro informování o této činnosti (viz např. tzv. "ukecaný" režim nejen programů cp, mv, rm), zatímco chybový výstup slouži k předávání (zobrazování) zpráv o problémech při této činnosti, nestandardních situacích, upozorněních, chybách. Přesměrování výstupu výše se týkalo standardního výstupu, chybový výstup je ale možné z terminálu do souboru přesměrovat také, použitím 2> místo jen > (technicky, chybový výstup je identifikovaný číslem 2, standardní číslem 1). Často se toho využívá pro "zbavení se" tohoto výstupu z terminálu pryč, ale ne do konkrétního souboru, nýbrž do "černé díry" /dev/null, například ls neexistuje 2> /dev/null. Přesměrovat můžeme i oba výstupy současně, použitím &>.

Skupina příkazů

Již ze třetího cvičení se základy příkazového řádku a shellu víme, že příkazů můžeme na řádku zadat a nechat jich "naráz" vykonat víc. Jejich oddělením znakem ; (středník) se vykonají postupně za sebou v pořadí zápisu, další po dokončení předchozího. Pokud místo ; použijeme & (amperand), bude každý příkaz před tímto znakem vykonaný na pozadí, viz řízení úloh v předchozím šestém cvičení, což znamená, že jeho vykonávání bude probíhat souběžně s vykonáváním dalšího příkazu za tímto znakem (i poslední příkaz může být zakončený & a být vykonávaný na pozadí). Tyto způsoby vykonávání příkazů můžeme i kombinovat, ovšem s tím, že "& má přednost před ;", tj. nejdříve se (souběžně) vykonají příkazy oddělené & a až po nich další oddělené ;. Pro opačný způsob, tj. vykonání na pozadí více příkazů oddělených ; a vykonávaných postupně, jako "celku", musíme tyto příkazy uzavřít do skupiny, použitím { příkazy; } (POZOR: za { musí být alespoň jedna mezera, nebo přechod na nový řádek, a před } musí být poslední příkaz "potvrzen" ukončením ;, & nebo Enter, tj. přechodem na nový řádek). Přidáním & za skupinu ji pak celou vykonáme na pozadí.

Skupina příkazů se může "hodit" i ve spojení s přesměrováním výstupu do souboru. Přesměrování se totiž týká každého příkazu zvlášť a při použití například "na konci" více zadaných příkazů je tak přesměrovaný výstup pouze posledního příkazu. Pokud ale příkazy uzavřeme do skupiny a přesměrování výstupu použijeme na celou skupinu, bude do souboru přesměrovaný výstup všech příkazů ve skupině, například { echo -n Pocitac:\ ; hostname; } > pocitac.txt (což je rozdíl oproti echo -n Pocitac:\ ; hostname > pocitac.txt). Přesměrováním vstupu pro všechny příkazy ve skupině se už ale takto udělat nedá, to je aplikováno jen na první příkaz skupiny.

Roura (pipe)

Když každý příkaz (proces) může získávat data skrze vstup a poskytovat data skrze výstup a tyto je možné přesměrovat z terminálu na soubor, pak by jistě bylo užitečné, kdyby výstup jednoho příkazu mohl být předaný (přesměrovaný) na vstup jiného příkazu "rovnou", bez souboru jako (dočasného) prostředníka. Tj. bez toho nejdříve výstup prvního příkazu přesměrováním uložit do souboru a pak obsah tohoto souboru předat přesměrováním vstupu druhému příkazu. Přesně k tomuto účelu slouží roura (pipe)! Zapsáním | (svislítka) mezi příkazy zařídíme "přímé napojení" (přesměrování) standardního výstupu (prvního) příkazu před | na vstup (druhého) příkazu za |. Navíc, dle očekávání, budou oba příkazy vykonávány souběžně jako jeden, co první vyprodukuje na výstupu, to druhý ihned dostane na vstupu, bez ukládání dat do nějakého souboru. Například ps aux | less nám zobrazí výstup ps aux rovnou v programu less pro interaktivní prohlížení (protože, podobně jako u cat, pokud programu less není předaná cesta k souboru jako argument, očekává data na vstupu). Kromě toho prvnímu příkazu je stále možné přesměrovat vstup (a také chybový výstup) a druhému výstup (oba), což znamená, že použití roury můžeme opakovat a takto propojit příkazů více než dva. Dodejme, že použitím | se "do roury" přesměrovává standardní výstup prvního příkazu, oba jeho výstupy (standardní i chybový) současně můžeme přesměrovat pomocí |&, a také, že všechny znaky <, >, | a { mají speciální význam a pokud chceme zadat je samotné, musíme je kvótovat.

Úkol 3:
Zobrazte výstup programu date a výpis všech procesů v systému současně v programu less.

Proměnné

Shell podporuje proměnné známé z programovacích jazyků (ve skutečnosti shell implementuje celý vlastní programovací jazyk, ale jeho většinu možností rozebírat nebudeme). Jsou (až na výjimky) automatické, tj. nové není třeba nějak deklarovat nebo definovat jako v běžných programovacích jazycích, stačí je rovnou použít uložením hodnoty, a také nejsou žádného partikulárního (datového) typu, jako hodnotu je do nich možné uložit libovolný obsah, typicky ale textový. Vedle uživatelských proměnných, jejichž jméno může být jakýkoliv řetězec z písmen (anglické abecedy), číslic a _ (podtržítka) nezačínající číslicí, má shell své vlastní předdefinované, se jmény typicky s velkými písmeny, a speciální, tzv. parametry, se jmény jeden speciální znak nebo cifra. Parametry vynecháme, vlastní proměnné shellu jsou např. USER se jménem uživatele, pod kterým shell běží, HOME s (absolutní) cestou k domovskému adresáři uživatele, PWD s (absolutní) cestou k aktuálnímu adresáři v shellu nebo třeba RANDOM s náhodným číslem mezi 0 a 32767, pro mnoho dalších viz manuálovou stránku shellu (man bash pro GNU Bash). Zmiňme ale ještě proměnnou PATH, jejíž hodnotou je seznam cest k adresářům, oddělených : (dvojtečkou), ve kterých shell hledá program ke spuštění se jménem zadaným jako první slovo příkazu, pokud to není interní příkaz shellu. Standardně v unixových systémech obsahuje systémové cesty k adresářům s instalovanými programy, např. /bin a /usr/bin, ale neobsahuje třeba cestu k aktuálnímu adresáři (.) – takže pokud si tuto cestu do seznamu nepřidáme, nelze, narozdíl od programů instalovaných v systému, spouštět programy z aktuálního adresáře pouze zadáním jejich jména (ale je nutné zadat cestu k nim, např. ./). Tuto vlastní proměnnou shellu změnit lze, ostatní ale většinou ne.

Hodnotu proměnné získáme tak, že před její jméno uvedeme znak $ (dolar), tzv. expanze proměnné. Můžeme ji pak použít kdekoliv v rámci příkazu shellu, například echo $USER. Pro uložení hodnoty do (uživatelské, i nové) proměnné je příkaz jméno_proměnné=hodnota, kde hodnota tedy mohou být jakákoliv data, typicky ale textová. V hodnotě funguje (je vyhodnocený) speciální význam znaků, takže pro ně samotné je nutné je kvótovat. A zde je rozdíl mezi kvótováním uzavřením řetězce, typicky celé hodnoty, mezi ' a ": mezi " má $ speciální význam, tj. funguje získání hodnoty proměnné, mezi ' ne. Tedy například U="user: $USER" uloží do proměnné U (správně) text s hodnotou proměnné USER, narozdíl od (zřejmě nesprávného) U='user: $USER' (po kterém bude v U text obsahující řetězec $USER).

Podobně jako mají příkazy a programy (procesy) vstup a výstup, který je možné z termimálu přesměrovat z/do souboru, mají i přístup k tzv. proměnným prostředí (běhového), získaným typicky od rodičovského procesu, ze kterého jsou spuštěny. Rodič ale musí před spuštěním potomka tyto proměnné pro něj nastavit. V případě shellu a jeho uživatelských proměnných (svoje vlastní shell některé takto nastavuje) tyto pro příkazy a programy z něj spuštěné takto automaticky nastaveny nejsou, tedy proměnné (jejich hodnoty) nejsou ve spuštěných příkazech a programech dostupné. Například když spustíme nový shell ("v shellu"), pro GNU Bash program bash, tak v něm nebudou proměnné z "nadřazeného" shellu dostupné. Ale můžeme je takto nastavit, exportovat, příkazem export proměnná, příp. i rovnou s uložením hodnoty export proměnná=hodnota (bez argumentu zobrazí seznam všech exportovaných proměnných), a pak dostupné budou.

Úkol 4:
Přidejte do seznamu cest v proměnné shellu PATH aktuální adresář (tj. cestu .) a proměnnou exportujte.

"Podshell"

Obráceně to ale nefunguje, proměnné z příkazu nebo programu (procesu), např. "z shellu v shellu", v shellu (procesu), ze kterého byly spuštěny, dostupné být nemohou. Toho se využívá právě u "shellu v shellu" a proto můžeme příkaz (nebo i více příkazů naráz) nechat vykonat v (automaticky spuštěném) "podshellu", uzavřením do (), například: (X=A; date +%$X) – proměnná X bude dostupná pouze v "podshellu" (a neovlivní případně existující proměnnou X v "nadřazeném" shellu). Znak ( má tedty opět speciální význam a pro něj samotný je potřeba ho kvótovat. Tato konstrukce navíc umožňuje získat data ze (standardního) výstupu příkazu v "podshellu" celá jako hodnotu a tu například uložit do proměnné nebo použít kdekoliv v rámci jiného příkazu shellu! Opět uvedením znaku $ před (), například echo $(date +%Y). V shellu se tomu říká substituce příkazu.

Aritmetika

Shell (GNU Bash) implementuje i jednoduchou celočíselnou aritmetiku. Zápis uzavřený mezi (()) (dvojité kulaté závorky, a pouze mezi nimi) se vyhodnocuje jako aritmetický výraz, např. ((1+2)). V tomto výrazu je možné používat i proměnné (jejich hodnoty), expanzí proměnné (zápisem s $ před jménem proměné, ale zde i bez něj), a dokonce i substituci příkazu ($(příkaz))! Hodnota proměnné nebo výstup příkazu je interpretován jako celé číslo, od začátku dokud jsou to číslice. Také je zde možné ukládat výsledek vyhodnocení výrazu do proměnné, například A=2; ((A=$A+3)). Výraz v (()) je ale pouze vyhodnocen, pro získání výsledku vyhodnocení výrazu (hodnotu) je potřeba opět použít znak $, tzv. expanzi aritmetiky: echo $(($A*2)). Mezi podporovanými operacemi v aritmetickém výrazu jsou třeba sčítání (operátor +) a odčítání (-), násobení (*) a dělení (celočíselné, /), zbytek po celočíselném dělení (%), umocňování (**) nebo logické (!, &&, ||) a srovnávací (==, !=, <, >) operace, další již nalezneme v manuálové stránce man bash.

Úkol 5:
Zobrazte, s využitím programu date (a jeho manuálové stránky, konkrétně pak i přepínače -d 12/24), počet dní zbývajících do Štědrého dne (24. 12.) aktuálního roku.

Tímto náhled na možnosti shellu ukončíme. Další z jeho bohatého repertoáru programovacího jazyka, například podmínky (kdy podmínkou je příkaz), cykly, funkce a uložení kódu do souboru (skriptu), nebo široké možnosti expanze proměnných a parametrů (funkcí a skriptů), proměnné typu pole, pokročilejší možnosti řízení úloh a správy historie příkazů nebo samotného příkazového řádku ponecháme zájemcům; manuálová stránka shellu je velmi cenným zdrojem informací.

Cvičení 8


Úkol 1:
Změňte kódování textu na vstupu z UTF-8 na cp1250, používaném na MS Windows, včetně správných konců řádků (na unixových systémech a MS Windows), a opačně.

– Úkol 2:
Vytvořte v textových editorech vim (vi), emacs (jed) a nano (pico) tabulku s několika řádky a sloupci (oddělenými např. tabulátorem) a vyzkoušejte si operace mazání znaků, slov, částí řádku, více řádků, kopírování a vložení částí řádku a několika řádků, undo a redo, vyhledání a náhrady řetězce za jiný a práci s více soubory a okny (otevření, zavření/uložení, přepínání).

– Úkol 3:
Vyzkoušejte (v příkazové řádce) klávesu C-x C-e a příkaz fc (včetně vyvolání příkazu začínajícího nějakým řetězcem).

Cvičení 9


Úkol 1:
Zobrazte očíslované řádky vstupu od 10. do 20. řádku včetně v opačném pořadí řádků.

Úkol 2:
Setřiďte (tabulkový) výstup programu df podle volného místa (čtvrtý sloupec) číselně sestupně.

Úkol 3:
Setřiďte výstup programu history podle příkazu, s odstraněním duplicitních příkazů (čísla příkazů ponechat).

Úkol 4:
Pomocí programů cut a paste prohoďte v tabulkovém vstupu (více než dva sloupce oddělené např. tabulátorem) první a druhý sloupec.

Úkol 5:
Zobrazte počet skupin, do kterých (váš) uživatel patří.

Úkol 6:
Zobrazte na jednom řádku seznam všech uživatelů, pod kterými běží v systému alespoň jeden proces.

Cvičení 10


Úkol 1:
V textových editorech vim (vi), emacs (jed) a nano (pico) vyhledejte na základě regulárního výrazu čísla, i necelá s případně desetinnou čárkou a necelou částí, následovaná mezerami a jednotkou B, kB, MB, GB nebo TB.

Úkol 2:
Změňte velikosti všech písmen na vstupu z malých na velká.

Úkol 3:
Zobrazte pouze řádky souboru, které nejsou v jiném souboru, tj. rozdíl souborů (jako rozdíl množin).

Úkol 4:
Zobrazte pouze řádky vstupu obsahující číslo zapsané v šestnáctkové soustavě začínající 0x (s malými i velkými písmeny).

Úkol 5:
Zobrazte seznam pouze souborů a adresářů s letošním datem modifikace.

Úkol 6:
Zobrazte pouze řádky vstupu, které neobsahují dvě stejná čísla.

Cvičení 11


Úkol 1:
Odstraňte ze vstupu mezery na koncích řádků.

Úkol 2:
Zobrazte ze vstupu pouze všechna čísla, i necelá s případně desetinnou čárkou a necelou částí, každé na samostatný řádek.

Úkol 3:
Pomocí programu sed prohoďte v tabulkovém vstupu (více než dva sloupce oddělené např. tabulátorem) první a druhý sloupec.

Úkol 4:
Zobrazte ze vstupu, ve kterém některé řádky představují nadpisy uvozené číslováním 1., 1.1, 1.1.1 atd., pouze tyto nadpisy, bez číslování a ve stromové struktuře -- odsazením levého okraje podnadpisů od levého okraje nadřazeného nadpisu mezerou.

Cvičení 12


Úkol 1:
Pomocí programu awk zobrazte z tabulkového vstupu (sloupce oddělené např. tabulátorem) pouze dva sloupce specifikované v proměnných předaných awk při jeho spuštění.

Úkol 2:
Zobrazte, ze souboru /etc/passwd, seznam uživatelů ve tvaru login tabulátor plné jméno uživatele.

Úkol 3:
Z čísel ve sloupci v tabulkovém vstupu (sloupce oddělené např. tabulátorem) spočítejte jejich průměr.

Úkol 4:
Zobrazte ze vstupu obsahujícího (i vnořené) bloky textu začínající řádkem obsahujícím pouze slovo START a končící řádkem obsahujícím pouze slovo END pouze text bloků první úrovně (tj. není mimo bloky ani ve vnořených blocích).