Důležitou součástí výuky práce s Ubuntu a linuxovými distribucemi obecně je získání znalostí práce v prostředí shellu. Grafická prostředí, jako je GNOME, která jsou součástí systému Linux, sice poskytují uživatelsky přívětivé rozhraní operačního systému, v praxi však prostředí shellu poskytuje mnohem větší možnosti, flexibilitu a automatizaci, než jakých lze kdy dosáhnout pomocí grafických nástrojů. Prostředí shellu také poskytuje prostředky pro interakci s operačním systémem v případě, že není k dispozici prostředí pracovní plochy, což je častý jev při práci se serverovým operačním systémem, jako je Ubuntu, nebo s poškozeným systémem, který nelze plně spustit.
Cílem této kapitoly je proto poskytnout přehled výchozího prostředí shellu v Ubuntu (konkrétně shellu Bash).
1.1 Co je shell?
Shell je interaktivní prostředí interpretující příkazy, v němž lze zadávat příkazy na výzvu nebo je zadávat do souboru ve formě skriptu a spouštět je. Počátky shellu lze vysledovat až do raných dob operačního systému UNIX. V raných dobách Linuxu před zavedením grafických pracovních ploch byl shell vlastně jediným způsobem, jak mohl uživatel komunikovat s operačním systémem.
V průběhu let byla vyvinuta řada různých prostředí shellu. Prvním široce používaným shellem byl Bourneův shell, který napsal Stephen Bourne v Bellových laboratořích.
Dalším raným výtvorem byl shell C, který měl některé syntaktické podobnosti s programovacím jazykem C a zavedl vylepšení použitelnosti, jako je editace příkazového řádku a historie.
Pouzdro Korn (vyvinuté Davidem Kornem v Bell Labs) je založeno na funkcích, které poskytovaly jak Bourne shell, tak C shell.
Výchozí shell v Ubuntu je Bash shell (zkratka pro Bourne Again SHell). Tento shell, který vznikl jako open source verze Bourne shellu, byl vyvinut pro projekt GNU Brianem Foxem a je založen na funkcích poskytovaných Bourne shellem i C shellem.
1.2 Získání přístupu k shellu
Z prostředí GNOME lze k výzvě shellu přistupovat z okna Terminálu výběrem možnosti Činnosti v horní liště, zadáním Terminálu do vyhledávacího řádku a kliknutím na ikonu Terminálu.
Při vzdáleném přihlášení k serveru Ubuntu, například pomocí SSH, se uživateli rovněž zobrazí výzva shellu. Podrobnosti o přístupu ke vzdálenému serveru pomocí SSH budou popsány v kapitole „Konfigurace ověřování pomocí klíčů SSH v Ubuntu“. Při zavádění systému založeného na serveru, ve kterém nebylo nainstalováno desktopové prostředí, je shell zadán ihned poté, co uživatel dokončí přihlašovací proceduru na fyzickém konzolovém terminálu nebo relaci vzdáleného přihlášení.
1.3 Zadávání příkazů na výzvu
Příkazy se zadávají na výzvu shellu jednoduše zadáním příkazu a stisknutím klávesy Enter. Některé příkazy provádějí úlohy tiše, většina z nich však před návratem na výzvu zobrazí nějaký výstup. Například příkaz ls lze použít k zobrazení souborů a adresářů v aktuálním pracovním adresáři:
$ ls
Plocha Dokumenty Stažené soubory Hudba Obrázky Veřejné šablony Videa
Dostupné příkazy jsou buď zabudovány do samotného shellu, nebo se nacházejí ve fyzickém systému souborů. Umístění příkazu v souborovém systému lze zjistit pomocí příkazu which. Chcete-li například zjistit, kde se v souborovém systému nachází spustitelný příkaz ls:
$ which ls alias ls='ls --color=auto' /usr/bin/ls
Je zřejmé, že příkaz ls se nachází v adresáři /usr/bin. Všimněte si také, že je nakonfigurován alias, což je téma, kterému se budeme věnovat později v této kapitole. Použití příkazu which k vyhledání cesty k příkazům, které jsou zabudovány do shellu, bude mít za následek hlášení, že spustitelný soubor nelze nalézt. Například při pokusu o nalezení umístění příkazu history (který je ve skutečnosti zabudován do shellu a neexistuje jako spustitelný soubor v souborovém systému) bude výsledkem výstup podobný následujícímu:
$ which history/usr/bin/which: no history in (/home/demo/.local/bin:/home/demo/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin)
1.4 Získání informací o příkazu
Mnoho příkazů, které má shell Linux k dispozici, se může zdát na začátku záhadných. Chcete-li zjistit podrobné informace o tom, co příkaz dělá a jak jej používat, použijte příkaz man, v němž jako argument uvedete název příkazu. Chcete-li se například dozvědět více o příkazu pwd:
$ man pwd
Po provedení výše uvedeného příkazu se zobrazí podrobný popis příkazu pwd. Mnoho příkazů také poskytne další informace, pokud jsou spuštěny s volbou příkazového řádku -help:
$ wc --help
1.5 Úprava příkazového řádku v prostředí Bash
Předchozí prostředí shellu neposkytovala žádnou formu možnosti úpravy řádků. To znamenalo, že pokud jste si všimli chyby na začátku dlouhého příkazového řádku, který jste zadávali, museli jste odstranit všechny následující znaky, chybu opravit a poté znovu zadat zbytek příkazu. Naštěstí Bash poskytuje širokou škálu možností úprav příkazového řádku, jak je uvedeno v následující tabulce:
Sekvence kláves | Akce |
Ctrl-b nebo šipka vlevo | Přesun kurzoru o jednu pozici zpět |
Ctrl-f nebo šipka doprava | Přesun kurzoru o jednu pozici vpřed |
Smazat | Smazání aktuálního znaku. pod kurzorem |
Backspace | Smazání znaku vlevo od kurzoru |
Ctrl-_ | Vrátit předchozí změnu (lze opakovat pro vrácení všech předchozích změn) |
Ctrl-a | Přesun kurzoru na začátek řádku |
Ctrl-e | Přesun kurzoru na konec řádku |
Meta-f nebo Esc a pak f | Přesun kurzoru o jedno slovo vpřed |
Meta-b nebo Esc a pak b | Přesun kurzoru o jedno slovo zpět |
Ctrl-l | Vymazat z obrazovky vše kromě aktuálního příkazu |
Ctrl-k | Smazat na konec řádku od aktuální pozice kurzoru |
Meta-d nebo Esc pak d | Smazání na konec aktuálního slova |
Meta-DEL nebo Esc pak DEL | Smazání začátku na aktuální slovo |
Ctrl-w | Smazání od aktuální pozice kurzoru k předchozí bílé mezeře |
Tabulka 9-1
1.6 Práce s historií shellu
Pouzdro Bash poskytuje kromě funkcí pro úpravu příkazového řádku také podporu historie příkazového řádku. Seznam dříve provedených příkazů lze zobrazit pomocí příkazu historie:
$ history1ps2ls3ls –l /4ls5man pwd6man apropos
Krom toho lze pomocí kláves Ctrl-p (nebo šipky nahoru) a Ctrl-n (nebo šipky dolů) procházet dříve zadané příkazy tam a zpět. Po zobrazení požadovaného příkazu z historie jej provedete stisknutím klávesy Enter.
Další možností je zadat znak ‚!“ následovaný několika prvními znaky příkazu, který se má opakovat, a poté stisknout klávesu Enter.
1.7 Zkrácený název souboru
Mnoho příkazů shellu přijímá jako argumenty jeden nebo více názvů souborů. Například pro zobrazení obsahu textového souboru s názvem list.txt by se příkaz cat použil takto:
$ cat list.txt
Podobně lze zobrazit obsah více textových souborů zadáním všech názvů souborů jako argumentů:
$ cat list.txt list2.txt list3.txt list4.txt
Místo zadávání jednotlivých názvů lze použít porovnávání vzorů pro zadání všech souborů s názvy odpovídajícími určitým kritériím. Pro zjednodušení výše uvedeného příkladu lze například použít zástupný znak ‚*‘:
$ cat *.txt
Výše uvedený příkaz zobrazí obsah všech souborů končících příponou .txt. Lze jej dále omezit na všechny názvy souborů začínající na seznam a končící příponou .txt:
$ cat list*.txt
Shody jednotlivých znaků lze zadat pomocí znaku ‚?“:
$ cat list?.txt
1.8 Doplňování názvů souborů a cest
Namísto zadávání celého názvu souboru nebo cesty nebo použití porovnávání vzorů pro snížení množství psaní poskytuje shell funkci doplňování názvů souborů. Chcete-li použít doplňování názvu souboru, stačí zadat několik prvních znaků názvu souboru nebo cesty a poté dvakrát stisknout klávesu Esc. Shell pak za vás doplní název souboru prvním názvem souboru nebo cesty v adresáři, který odpovídá zadaným znakům. Chcete-li získat seznam možných shod, stiskněte po zadání prvních několika znaků klávesu Esc =.
1.9 Přesměrování vstupu a výstupu
Jak již bylo uvedeno, mnoho příkazů shellu při svém spuštění vypisuje informace. Ve výchozím nastavení jde tento výstup do souboru zařízení s názvem stdout, což je v podstatě okno terminálu nebo konzola, ve které je shell spuštěn. A naopak, shell přijímá vstup ze souboru zařízení s názvem stdin, což je ve výchozím nastavení klávesnice.
Výstup z příkazu lze přesměrovat ze stdout do fyzického souboru v souborovém systému pomocí znaku ‚>‘. Například pro přesměrování výstupu z příkazu ls do souboru s názvem files.txt je zapotřebí následující příkaz:
$ ls *.txt > files.txt
Po dokončení bude soubor files.txt obsahovat seznam souborů v aktuálním adresáři. Podobně lze do příkazu místo stdin vložit obsah souboru. Například pro přesměrování obsahu souboru jako vstupu do příkazu:
$ wc –l < files.txt
Výše uvedený příkaz zobrazí počet řádků obsažených v souboru files.txt.
Je důležité poznamenat, že operátor přesměrování ‚>‘ při použití vytvoří nový soubor nebo zkrátí existující soubor. Chcete-li připojit existující soubor, použijte operátor ‚>>‘:
$ ls *.dat >> files.txt
Kromě standardního výstupu poskytuje shell také standardní chybový výstup pomocí stderr. Zatímco výstup z příkazu je směrován na stdout, všechna chybová hlášení generovaná příkazem jsou směrována na stderr. To znamená, že pokud je stdout nasměrován do souboru, chybová hlášení se přesto objeví v terminálu. To je obecně žádoucí chování, i když v případě potřeby lze stderr přesměrovat také pomocí operátoru ‚2>‘:
$ ls dkjfnvkjdnf 2> errormsg
Po dokončení příkazu bude v souboru errormsg obsažena chybová zpráva o tom, že soubor s názvem dkjfnvkjdnf nebyl nalezen.
Příkaz stderr i stdout lze přesměrovat do stejného souboru pomocí operátoru &>:
$ ls /etc dkjfnvkjdnf &> alloutput
Po dokončení provádění bude soubor alloutput obsahovat jak výpis obsahu adresáře /etc, tak chybové hlášení spojené s pokusem o výpis neexistujícího souboru.
1.10 Práce s potrubím v prostředí Bash
Prostředí Bash umožňuje kromě přesměrování vstupů a výstupů také přímé odeslání výstupu z jednoho příkazu jako vstupu do jiného příkazu. Operace pipe se provádí umístěním znaku ‚|‘ mezi dva nebo více příkazů na příkazovém řádku. Chcete-li například spočítat počet procesů běžících v systému, můžete výstup z příkazu ps přesměrovat do příkazu wc:
$ ps –ef | wc –l
Počet operací pipe, které lze na příkazovém řádku provést, není omezen. Například pro zjištění počtu řádků v souboru, které obsahují jméno Smith:
$ cat namesfile | grep Smith | wc –l
1.11 Konfigurace aliasů
Při získávání zkušeností s prostředím shellu je pravděpodobné, že budete často vydávat příkazy se stejnými argumenty. Například můžete často používat příkaz ls s volbami l a t:
$ ls –lt
Pro snížení množství psaní při vydávání příkazu je možné vytvořit alias, který bude mapovat příkaz a argumenty. Například pro vytvoření aliasu tak, aby zadání písmene l způsobilo spuštění příkazu ls -lt, by se použil následující příkaz:
$ alias l="ls –lt"
Zadáním písmene l na příkazovém řádku se nyní spustí původní příkaz.
1.12 Proměnné prostředí
Proměnné prostředí prostředí shellu poskytují dočasné uložení dat a konfiguračních nastavení. Samotný shell nastavuje řadu proměnných prostředí, které může uživatel změnit a upravit tak chování shellu. Seznam aktuálně definovaných proměnných lze získat pomocí příkazu env:
$ envSSH_CONNECTION=192.168.0.19 61231 192.168.0.28 22MODULES_RUN_QUARANTINE=LD_LIBRARY_PATHLANG=en_US.UTF-8HISTCONTROL=ignoredupsHOSTNAME=demo-pc.ebookfrenzy.comXDG_SESSION_ID=15MODULES_CMD=/usr/share/Modules/libexec/modulecmd.tclUSER=demoENV=/usr/share/Modules/init/profile.shSELINUX_ROLE_REQUESTED=PWD=/home/demoHOME=/home/demoSSH_CLIENT=192.168.0.19 61231 22SELINUX_LEVEL_REQUESTED= ...
Možná nejužitečnější proměnnou prostředí je PATH. Ta definuje adresáře, ve kterých bude shell hledat příkazy zadané na příkazovém řádku, a pořadí, v jakém tak bude činit. Proměnná prostředí PATH pro uživatelský účet v nově nainstalovaném systému Ubuntu bude pravděpodobně nakonfigurována takto:
$ echo $PATH/home/demo/.local/bin:/home/demo/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/ bin:/usr/local/sbin:/usr/sbin
Další užitečnou proměnnou je HOME, která určuje domovský adresář aktuálního uživatele. Pokud byste například chtěli, aby shell hledal příkazy také v adresáři skriptů, který se nachází ve vašem domovském adresáři, upravili byste proměnnou PATH takto:
$ export PATH=$PATH:$HOME/scripts
Aktuální hodnotu existující proměnné prostředí můžete zobrazit pomocí příkazu echo:
$ echo $PATH
Vlastní proměnné prostředí můžete vytvořit pomocí příkazu export. Například:
$ export DATAPATH=/data/files
Užitečný trik, jak přiřadit výstup z příkazu proměnné prostředí, spočívá v použití zpětných uvozovek (`) kolem příkazu. Například pro přiřazení aktuálního data a času proměnné prostředí s názvem NOW:
$ export NOW=`date`$ echo $NOWTue Apr 2 13:48:40 EDT 2020
Pokud existují nastavení proměnných prostředí nebo aliasů, které je třeba konfigurovat při každém vstupu do prostředí shellu, lze je přidat do souboru v domovském adresáři s názvem .bashrc. Například v následujícím souboru .bashrc je nakonfigurována proměnná prostředí DATAPATH a alias:
# .bashrc # Source global definitionsif ; then . /etc/bashrcfi # User specific environmentPATH="$HOME/.local/bin:$HOME/bin:$PATH"export PATH # Uncomment the following line if you don't like systemctl's auto-paging feature:# export SYSTEMD_PAGER= # User specific aliases and functionsexport DATAPATH=/data/filesalias l="ls -lt"
1.13 Psaní skriptů shellu
Dosud jsme se zaměřili výhradně na interaktivní povahu shellu Bash. Interaktivitou jsme mysleli ruční zadávání příkazů na výzvu jeden po druhém a jejich provádění. Ve skutečnosti je to jen malá část toho, co shell umí. Pravděpodobně jeden z nejmocnějších aspektů shellu zahrnuje možnost vytvářet shellové skripty. Skripty shellu jsou v podstatě textové soubory obsahující sekvence příkazů, které lze v prostředí shellu spouštět za účelem provádění úloh. Kromě možnosti vykonávat příkazy poskytuje shell mnoho programovacích konstrukcí, jako jsou smyčky for a do a příkazy if, které lze očekávat ve skriptovacím jazyce.
Podrobný přehled skriptování v shellu bohužel přesahuje rozsah této kapitoly. Existuje však mnoho knih a webových zdrojů věnovaných skriptování shellu, které tomuto tématu věnují mnohem více pozornosti, než bychom zde mohli doufat. V této části proto poskytneme jen velmi malou ochutnávku skriptování shellu.
Prvním krokem při vytváření shellového skriptu je vytvoření souboru (pro účely tohoto příkladu jej pojmenujeme jednoduše.sh) a jako první řádek přidáme následující:
#!/bin/sh
Výraz #! se nazývá „shebang“ a je to speciální posloupnost znaků označující, že cesta k interpretu potřebnému ke spuštění skriptu je další položkou na řádku (v tomto případě spustitelný soubor sh umístěný v /bin). Stejně tak by to mohlo být například /bin/csh nebo /bin/ksh, pokud by se jednalo o interpret, který chcete použít.
Dalším krokem je napsání jednoduchého skriptu:
#!/bin/shfor i in *do echo $idone
Všechno, co tento skript udělá, je, že projde všechny soubory v aktuálním adresáři a zobrazí název každého souboru. Lze jej spustit předáním názvu skriptu jako argumentu příkazu sh:
$ sh simple.sh
Pro to, aby byl soubor spustitelný (čímž odpadá nutnost předávat jej příkazu sh), lze použít příkaz chmod:
$ chmod +x simple.sh
Po nastavení bitu execute na oprávnění souboru jej lze spustit přímo. Například:
$ ./simple.sh
1.14 Shrnutí
V této kapitole Základů Ubuntu jsme se stručně seznámili s prostředím shellu Bash. Ve světě grafických desktopových prostředí je snadné zapomenout, že skutečnou sílu a flexibilitu operačního systému lze často využít pouze tak, že klesnete pod uživatelsky přívětivé desktopové rozhraní a použijete prostředí shellu. Znalost shellu je navíc nutností, když je třeba spravovat a udržovat serverové systémy, které nemají nainstalovaný desktop, nebo když se pokoušíte opravit systém, který je poškozený do té míry, že se desktop nebo rozhraní Cockpit již nespustí.