Cvičení 2
      Spouštění procesů na pozadí. Změna priority procesu. Zasílání signálů. 
      Plánované spouštění procesů. Hledání spustitelných souborů.
      Přesměrování. Roura. Expanse neúplných jmen souborů. Proměnné. 
      Export proměnných. Vytváření skriptů. Základní řídící struktury.
      Předávání argumentů. Přizpůsobení nastavení shellu.
    
  1.  Správa procesů, signály
	Úvodní část cvičení se zabývá spouštěním procesů na pozadí,
	změnou jejich priority. Procvičováno je používání programů
	kill(1),
	nice(1)
	a  renice(1).
      
	Proces na pozadí spustíme tak, že na konec příkazu přidáme
	znak ampersand;
      
| | $ cp -r /mnt/cdrom/photo/* /tmp/nowakj/ & [2] 3861
 $
 | 
 | 
	Seznam procesů na pozadí zjistíme příkazem 
	jobs(1).
      
| | $ jobs [1]   Running                 rxvt -sb -fg pink &
 [2]   Running                 Eterm &
 [3]-  Running                 emacs practice2.xml &
 [4]+  Stopped                 gkrellm &
 $
 | 
 | 
	Přesunutí procesu na pozadí se provede příkazem
	bg(1).
      
	Pozastavený proces nebo proces běžící na pozadí můžeme přenést
	na popředí příkazem fg(1).
      
	Příkazem nice(1) se nastaví priorita
	nově spuštěného procesu. Čím je hodnota nice vyšší, tím je
	proces „hodnější“ (nice) k ostatním a běží pouze
	když je volný procesor. Obyčejný uživatel může měnit hodnotu
	nice pouze svých procesů a to pouze směrem
	nahoru (základní úroveň je 0).
      
| | $ nice -n 15 cp /mnt/cdrom/* /tmp/cd/ | 
 | 
	Priorita již běžícího procesu se mění programem
	renice(1). První číslo je nová
	priorita, druhé je PID procesu.
      
| | $ renice 14 3333 3333: old priority 10, new priority 14
 | 
 | 
	Signály se mohou zasílat příkazem kill(1).
	Seznam povolených signálů je v signal(7).
      
	Ve většině interaktivních (obvykle konzolových programů)
	způsobí stisk Ctrl+Z zaslání signálu SIGSTOP, čehož můžete
	využít k zastavení procesu a přechodu do shellu.
      
| | $ ed a
 Ed je standardní unixový editor
 .
 w test
 32
 ^Z
 
 [5]+  Stopped                 ed
 $
 | 
 | 
	
Úkol 1. 
	  Spusťte program top(1)
          a zastavte jej. Přesuňte jej na pozadí.
	  Spusťte ještě několik programů. Nakonec je všechny ukončete
	  zasláním vhodných signálů.
	
      
  2.  Přesměrování, roury
	K přesměrování standardního vstupu/výstupu slouží znaky
	< a >. Například takto podivně by se mohlo
	provádět kopírování souborů
      
	Roury (pipes) slouží k předávání výstupu jednoho programu na
	vstup jiného. Následující příklad bude číst ze standardního
	vstupu data, poté je setřídí a nakonec odfiltruje duplicitní
	řádky.
      
| | $ cat | sort -n | uniq jedna
 dva
 tri
 dva
 ^D
 dva
 jedna
 tri
 | 
 | 
	
Úkol 2. 
	  S využitím probraných filtrů setřiďte různými způsoby výstup
	  programu last(1).
	
      
  3.  Spouštění příkazů v určitou dobu
      
| | $ at now + 3 hours warning: commands will be executed using /bin/sh
 at> /sbin/reboot
 at> ^D
 job 1 at 2001-08-29 23:19
 $
 | 
 | 
	Seznam všech vašich úloh zjistíte příkazem
	atq(1),
	atrm(1) slouží k jejich odstranění.
      
| | $ atq 1       2001-08-29 23:19 a novakj
 $ atrm 1
 $
 | 
 | 
  4.  Hledání spustitelných souborů
	Vyzkoušejte vyhledávat spustitelné soubory
	v systému pomocí příkazů
	locate(1),
	which(1)
	a whereis(1).
      
  5.  Proměnné
	Tato sekce je pozvolným úvodem k vytváření shellových
	skriptů. Probírají se zde proměnné a jejich použití.
      
	Přiřazení do proměnné se provede následujícím příkazem
	(mezi rovnítkem a oběma stranami přiřazení nesmí být mezera):
      
	Obsah proměnné můžeme vypsat příkazem
	echo(1). (Při dotazování na obsah
	proměnné musíme použít před jménem znak dolar).
      
| | $ echo Obsah promenne \$POZDRAV je $POZDRAV Obsah promenne $POZDRAV je Dobry den
 | 
 | 
	Proměnné lze použít například pro uchování dlouhé cesty k
	souboru, abychom ji nemuseli stále vypisovat.
      
| | $ SOUBOR=/usr/share/emacs/20.7/etc/sex.6 $ cp $SOUBOR /mnt/zip/
 $ man $SOUBOR
 ...
 | 
 | 
	
Úkol 3. 
	  Prohlédněte si obsah systémových proměnných $MAIL,
          $HOME, $USER. Vytvořte si nějakou vlastní proměnnou
	  a kreativně ji použijte v nějakém ze známých
	  příkazů.
	
      
  6.  Programování v (bash) shellu
	Nyní si studenti podle přednášek vyzkouší napsat několik
	krátkých shellových skriptů. Je doporučeno využívat proměnných
	a použité příkazy efektivně spojovat do rour. Procvičovány
	jsou základní řídící konstrukce.
      
	Zde
	je velmi pěkný úvod i s ukázkami funkčního kódu.
      
	V následujícím příkladu přidáme všem souborům
	(v adresáři /tmp) končícím na „txt“
        příponu „.backup“.
      
| | $ for i in /tmp/*txt; do mv $i $i.backup; done | 
 | 
	Následuje jednoduchý příklad na větvení programu pomocí
	konstrukce if-else.
      
| | $ if [ `whoami` = "root" ] >  then echo "Jsem buh"
 >  else echo "Tak zas nekdy priste"
 > fi
 Tak zas nekdy priste
 $
 | 
 | 
	
Úkol 4. 
	  Napište jednoduchý skript, kterým zkopírujete soubor
	  /usr/share/common-licenses/BSD na ~/BSD.old,
	  ale pouze pokud je nastavená proměnná $BACKUP.
	
      
  7.  Přizpůsobení shellu
	V této části si studenti za pomoci právě vyzkoušených příkazů
	nastaví vzhled svého shellu. Více informací je
	v bash(1)
      
	Pro perzistentní uložení nastavení slouží soubory
	~/.bash_profile a ~/.bashrc.
        Proměnné PS1 až PS4 slouží
	k  nastavení různých promptů, hlavní je PS1.
      
	První ukázka nastaví prompt, aby zobrazoval aktuální adresář.
      
	Druhá donutí prompt, aby zobrazoval jmého počítače a za
	dvojtečkou jméno uživatele.
      
| | $ PS1='\h:\u \$ ' alpha:novakj $
 | 
 | 
	Třetí v promptu zobrazuje aktuální datum, čas a pracovní
	adresář.
      
| | $ PS1='\d, \t \w> ' Fri Aug 31, 17:14:17 /tmp>
 | 
 | 
	Poslední ukázka nadefinuje funkci vypisující počet procesů
	běžících na pozadí a poté nadefinuje zelený prompt, ve kterém
	se mj. zobrazuje počet procesů spuštěných z tohoto shellu.
      
| | $ function jobcount { >    JOBS=`jobs | wc -l | awk {'print $1'}`
 >    [ $JOBS != 0 ] && echo -n "$JOBS:"
 > }
 $ PS1='\[\e[22m\e[40m\e[32m\]\h:`jobcount`\w\$\[\e[22m\e[40m\e[37m\] '
 phoenix:3:/var/tmp$
 | 
 | 
	
Úkol 5. 
	  Zkuste si nastavit různé druhy promptů. Pokud budete s některým
          tvarem promptu spokojeni, můžete si jeho konfiguraci zapsat do
          skriptů spouštějících se po vašem přihlášení do systémy.