Menu

První cvičení (23. 2.)

Seznámení se s prostředím

Příkazy zadáváme do emulátoru terminálu – xterm, GNOME Terminal, Konsole, rxvt, … Zadaný příkaz spustíme stiskem klávesy <Enter> (odřádkováním). Emulátor terminálu nám obvykle nabízí historii – k poslednímu zadanému příkazu se vrátíme stiskem šipky nahoru. Pokud chceme vyhledávat mezi dávnějšími příkazy, použijeme klávesovou zkratku <Ctrl-R> a poté napíšeme část názvu příkazu. Dalším stiskem <Ctrl-R> se zanoříme hlouběji do minulosti. Tato historie ale není bezedná, obvykle pojme jen cca 500 posledních příkazů (tento počet lze nastavit).

Pokud napíšeme pouze část jména příkazu, můžeme nechat shell, aby jej doplnil a to stiskem klávesy <Tab>. Stejně tak to funguje i na jména souborů.

Další užitečné klávesové zkratky jsou <Ctrl-C> pro zastavení běhu programu, <Ctrl-D> pro ukončení standardního vstupu, <Ctrl-Z> pro pozastavení běhu programu a <Ctrl-L> pro vyčištění obrazovky terminálu. Klávesa <Tab> spouští doplňování názvů souborů.

Cesty v souborovém systému

V zápisu cesty jsou od sebe adresáře odděleny znakem /. Vždy když máme otevřen emulátor terminálu, nacházíme se v nějakém adresáři a všechny příkazy, které v tu chvíli zavoláme spouštíme uvnitř tohoto adresáře. Adresář, ve kterém se právě nacházíme budeme označovat jako pracovní. Každá cesta může být absolutní, nebo relativní. Absolutní začíná lomítkem a vztahuje ke kořenovému adresáři /. Naopak, relativní cesta se vztahuje k pracovnímu adresáři.

Speciální soubory:

~     ... domovský adresář
.     ... pracovní adresář
..    ... nadřazený adresář
.abc  ... soubory začínající tečkou jsou skryté

Skryté soubory se defaultně nezobrazují při vypsání obsahu adresáře, ani při expanzi * (viz níže).

Příkazy

Zadání příkazu má obvykle tři části – jméno příkazu, přepínače a parametry. Přepínače a parametry ovlivňují chování příkazu a mohou, ale nemusí být uvedeny.

ls -i -d /tmp  ... vypíše adresář /tmp (nikoliv jeho obsah)
                   a jeho číslo inode
ls -id /tmp    ... totéž, se sloučenými přepínači
ls -i /tmp     ... vypíše obsah adresáře /tmp a čísla inode 
                   jednotlivých souborů
ls -d /tmp     ... vypíše adresář /tmp
ls -id         ... vypíše pracovní adresář a jeho číslo inode
ls             ... vypíše obsah pracovního adresáře

Metaznaky

Metaznaky jsou znaky, které mají v shellu speciální význam. Chceme-li tento speciální význam potlačit a zapsat je jako normální znaky, musíme před ně zapsat zpětné lomítko \. Metaznaky jsou mj. \|&;()<>[]*? a navíc mezera a tabulátor. Nejvíce potíží zažijete pravděpodobně s mezerou. Pozor na to, mezera odděluje jednotlivé parametry příkazu. Chcete-li zadat parametr obsahující mezery, musíte potlačit jejich speciální význam předřazením \ (případně uvozovkami či apostrofy, ale o tom zase někdy jindy).

Expanze

Expanze je činnost prováděná na úrovni shellu, která předtím, než spustí příkaz a předá mu parametry nahradí některé znaky či jejich posloupnosti něčím jiným. Prozatím si vystačíme jen s jedním expanzním znakem a to *. * se expanduje na libovolnou (i prázdnou) posloupnost znaků, která odpovídá jménu souboru v daném adresáři. Lépe to bude vidět na příkladu:

ls -d *             ... vypíše všechny soubory v pracovním adresáři
ls -d *.txt         ... vypíše všechny soubory s příponou .txt
ls -d *\ *          ... vypíše všechny soubory, které obsahují 
                        v názvu mezeru
ls -d /etc/*.conf   ... vypíše všechny soubory v adresáři /etc 
                        s příponou .conf
ls -d */*.jpg       ... vypíše všechny soubory s příponou jpg, které 
                        se nachází v podadresáři pracovního adresáře
ls -d .*            ... vypíše všechny skryté soubory

Kromě posledního příkladu se však nikdy nezahrnou skryté soubory začínající tečkou. Znak * se na ně prostě neexpanduje.


Pro řešení příkladů se vám bude hodit přehled základních příkazů.

Příklady

Zobrazit řešení
  1. Vypište obsah adresáře /etc (použijte příkaz ls)
    ls /etc
    
  2. Vypište podrobný obsah adresáře /etc (použijte man ls, abyste zjistili jaký přepínač máte použít).
    ls -l /etc
    
  3. Zjistěte absolutní cestu k pracovnímu adresáři.
    pwd
    
  4. Vypište obsah nadřazeného adresáře.
    ls ..
    
  5. Udělejte si malou procházku po souborovém systému: Přesuňte se do adresáře /etc, poté se přesuňte do podadresáře apache2/vhosts.d, vypište jeho obsah, přesuňte se do nadřazeného adresáře, vypište jeho obsah a vraťte se zpět do svého domovského adresáře.
    cd /etc
    cd apache2/vhosts.d
    ls
    cd ..
    ls
    cd
    
  6. Přesuňte se do adresáře /etc, vypište jeho obsah a vraťte se zpět do svého domovského adresáře. Zkuste napsat řešení na jeden řádek.
    cd /etc; ls; cd
    
  7. Vytvořte soubor datum, jehož obsahem bude jedna řádka se slovem Datum.
    echo Datum > datum
    
  8. Vytvořte soubor datum, na jehož první řádce bude slovo Datum a na druhé řádce aktuální datum ve formátu DD. MM. YYYY.
    echo Datum > datum
    date +"%d. %m. %Y" >> datum
    
    Řešení jedním příkazem:
    date +"Datum%n%d. %m. %Y" > datum
    
  9. Vytvořte adresář s názvem One above all a poté jej smažte.
    Špatné řešení, které vytvoří 3 adresáře:
    mkdir One above all
    
    Správná řešení:
    mkdir One\ above\ all
    mkdir "One above all"
    mkdir 'One above all'
    
  10. Zjistěte typ všech souborů v aktuálním adresáři pomocí příkazu file.
    file * .*
    
  11. Vytvořte adresář dir a v něm tři soubory alice, bob a cecil. Poté alici přejmenujte na alfonsii a všechny tři jedním příkazem smažte, aniž byste po jednom vypisovali jejich jména.
    mkdir dir
    touch dir/alice dir/bob dir/cecil
    mv dir/alice dir/alfonsie
    rm dir/*
    
  12. Vypište prvních 10 řádek ze souboru /etc/passwd.
    head /etc/passwd
    
  13. Vypište prvních 15 řádek ze souboru /etc/passwd.
    head -n 15 /etc/passwd
    
  14. Vytvořte soubor s názvem -f a poté jej smažte.
    touch -- -f; rm -- -f
    touch -- -f; rm ./-f
    
  15. Spočtěte počet řádek souboru /etc/passwd
    wc -l /etc/passwd
    
  16. Vypište 10. až poslední řádek ze souboru /etc/passwd.
    tail -n +10 /etc/passwd
    
  17. Vypište 11. až 20. řádek ze souboru /etc/passwd.
    head -n 20 /etc/passwd > tmpfile
    tail tmpfile
    
  18. Vypište 13. až 17. řádek ze souboru /etc/passwd.
    head -n 17 /etc/passwd > tmpfile
    tail -n +13 tmpfile
    
  19. Spočtěte počet souborů ve svém domovském adresáři (kromě skrytých).
    ls ~ > tmpfile
    wc -l tmpfile
    

Příklady pro pokročilé

  1. Vypište jména všech uživatelů, kteří se někdy přihlásili na váš počítač, každého právě jednou. Seznam přihlášení získáte příkazem last.
  2. Napište skript, který provede množinový průnik. Na vstupu dostane dva soubory a má vypsat právě ty řádky, které se vyskytují v obou souborech. Na pořadí nezáleží.
  3. Napište skript, který provede množinový rozdíl. Na vstupu dostane dva soubory a má vypsat právě ty řádky, které se vyskytují v prvním a nevyskytují ve druhém. Na pořadí záleží (musí být stejné jako v prvním souboru).
  4. Napište skript, který vyhledá všechna data v souboru zapsaná ve formátu MM/DD/YYYY a převede je do formátu DD. MM. YYYY.
  5. Vypište posledních 10 přihlášených uživatelů na vašem počítači, v pořadí dle času jejich posledního přihlášení.