- Nejfrekventovanější program pro většinu uživatelů je shell
- prostředník mezi uživatelem a Unixem, není součástí jádra
- na konkrétním systému bývá více shellů, např,
- Bournův shell (sh)
- C shell (csh)
- Kornův shell (ksh)
- tcsh
- po přihlášení se vytvoří proces spuštěním přihlašovacího shellu
- čte ze standardního vstupu
- interpretuje zadané příkazy
- výstupy příkazů tiskne na standardní výstup, popř. do jiných souborů
- dispozici jsou rozsáhlé programovací prostředky
- První shell, k dispozici na všech systémech
- je v něm řada systémových nástrojů
- pro začátečníka vhodné vyhledat v systému skripty ke studiu - /bin, /usr/bin, /etc, ...
- od něj odvozeny další shelly - ksh, bash
- vhodnější k programování než csh
- ke studiu vhodné vyhledat v systému skripty - adresáře /bin, /usr/bin, /etc, ...
sh [ -acefhiknrstuvx ] [argumenty ]
rsh [ -acefhiknrstuvx ][ argument... ]
- -r
- omezený shell, rovnocenné vyvolání rsh
- -f
- vypne použití expanzních znaků při generování jmen souborů
- -n
- pouze čte příkazy, ale nevykonává je
- -v
- opisuje načtené vstupní řádky na standardní výstup
- -x
- tiskne příkazy a jejich argumenty při jejich provádění (vhodné pro ladění scénářů)
- Po přihlášení se shell ozve $, popř. # pro uživatele root
- očekává zadání povelu
Obecný tvar:
arg0 arg1 arg2 ...
- arg0 a další značí textové řetězce oddělené jednou či více mezerami nebo tabulátory
- arg0 je jméno příkazu
- význam dalších argumentů definován pro každý příkaz
- arg1 -řetězec definuje volby
- jinak poziční parametry, které zpravidla objekty, s nimiž příkaz manipuluje
Např.
$ ls -al
$ wc dopis
$ wc -l dopis zprava
- příkaz vrací kód návratu do proměnné ?
- většinou nulový kód pro bezchybné vykonání příkazu
- kód různý od nuly zpravidla chybu
- proto v logických operacích provda 0, nepravda 1
- na základě návratového kódu lze rozhodnout o další akci u terminálu nebo v shellovském skriptu.
- Vnitřní příkazy obsahuje program sh
- vnější příkazy hledá standardně:
- v knihovně /bin
- v adresáři /usr/bin
- vnější lokální příkaz v aktuálním adresáři
- pořadí prohledávaní adresářů dáno jejich pořadím v proměnné prostředí PATH
- příkaz s úplnou cestou - např. ve tvaru
- $ /usr/pisisvour/difrov -stiff soustava1 hledá pouze v adresáři /usr/pisisvour a nikde jinde
- * v názvu souboru nahrazuje libovolný řetězec znaků
- znak ? jeden libovolný znak
- [řetězec] nahrazuje znaky, které jsou v něm obsaženy, lze zapsat i interval znaků ve tvaru znak1-znak2
- * jsou všechny soubory v aktuálním adresáři,
- $HOME/zdroj/*.c všechny zdrojové texty v jazyce C v adresáři $HOME/zdroj
- [a-cA-C]*.txt soubory aktuálního adresáře, které začínají na a,b,c,A,B,C a mají příponu .txt
- expanzní znaky i ve v jménechadresářů - $ lf /usr/*
- jméno souboru, které začína znakem '.' (tečka) je při použití expanzních znaků "nepřístupné", je třeba tečku na začátku explicitně zadat.
- Např.
- $ cat * nevypíše soubor .profile
- je tedy třeba napsat $ cat .profile *
Většina příkazů může číst data z klávesnice terminálu a výsledky vypisuje na obrazovku
- Shell jako každý proces operuje s tabulkou komunikačních kanál
- pro každý otevřený soubor jeden záznam
- tuto tabulku zdědí nový proces od svého otce.
- každý proces k dispozici kanály s čísly 0, 1, 2
- 0 standardní vstup
- 1 standardní výstup
- 2 chybový výstup
- operátory přesměrování
- <
- >
- >>
- mezi znaky přesměrování a textem mohou být nepovinně mezery
- ve jménech souborů použitých jako argumenty přesměrování nelze použít expanzních znaků.
Přesměrování standardního vstupu
- příkaz < soubor
- > soubor příkaz
Např.
tr "[a-z]" "[A-Z]" <seznam.txt .
Přesměrování standardního výstupu
- příkaz> soubor
- >soubor příkaz.
- pokud soubor neexistuje, pak se založí
- existující soubor se přepíše
- operátor >> soubor nepřepisuje, ale přidává výstup na jeho konec, neexistuje, i v tomto přídadě se založí.
Přesměrování ostatních vstupních/výstupních kanálů
- Před znak přesměrování zapíše číslo kanálu
Např.
$ cc soub1.c 2 > chyby.prekladu;
$ cc *.c 2 >> chyby.prekladu
- kanál daného čísla lze obecně přesměrovat do kanálu jiného čísla takto:
- kanál_1 < &kanál_2
- kanál_1 > &kanál_2 .
- použijeme-li v jednom příkazu několik přesměrování souborů, je jejich pořadí libovolné
Např.
$ ls -R /home >adresare.home 2>&1
zdroj_dat | spotřebič_dat.
- procesy zdroj_dat i spotřebič_dat běží současně a roura je vytvořena v operační paměti
- pokud je roura plná, pak zdroj_dat se pozastaví, až spotřebič_dat obsah roury vyčerpá
- je-li roura prázdná, pak se pozastaví spotřebič_dat až do jejího naplnění.
- procesy spojené rourou se nazývají kolona
Např.:
$ who | grep host
$ who | grep host | sort
$ who | grep host | wc -l
- v koloně někdy vhodný příkaz tee
- data ze standardního vstupu zapíše do souboru specifikovaného parametrem i na standardní výstup
Např.
$ cc modul.c 2>&1 | tee chyby.prc | more
- několik znaků, které mají zvláštní význam
- speciální znaky ve jménech souborů jsou *, ?, []
- $ značí hodnotu proměnné
- pro přesměrování vstupů/výstupů se používá < >
- pro použití jako normální znaky ASCII, musíme je před shellem zamaskovat:
- "nejtvrdší" ochranou metaznaků před shellem je uzavření řetězce do apostrofů
- apostrofy eliminují v řetězeci interpretaci všech metaznaků kromě apostrofu
- "měkčí" je uzavření řetězce do uvozovek
ponechává shellu jako metaznaky $, \, uvozovky, apostrof a opačný apostrof;
výhodné v případech, kdy chceme v řetězci nahradit proměnnou jejím obsahem či do něj vložit standardní výstup příkazu
- poslední možností je zpětné lomítko před znakem, které zamaskuje pouze tento znak.
- z toho plyne: apostrofy maskují uvozovky a uvozovky maskují apostrofy.
Např.
- touch * změní čas poslední manipulace se všemi soubory aktuálního adresáře
- touch '*' , touch "*", touch \* založí v aktuálním adresáři soubor se jménem *
- cat * vypíše všechny soubory aktuálního adresáře
- cat '*', cat "*" či cat \* vypíší obsah souboru *.
$ echo "sterilní Mc'Donald"
sterilní Mc'Donald
$
$ echo 'levicový "intelekuál"'
levicový "intelekuál"
Má-li text pokračovat na několika řádcích, uzavře se do apostrofů nebo se konec řádky zamaskuje \, který se na výstupu nezobrazuje. Na pokračovací řádce se zobrazí tzv. sekundární výzva k zadání textu:
$ echo 'Timur
> a jeho parta
'
Timur
a jeho parta
$ echo Prezident\
>a jeho poradci
Prezident
a jeho poradci
Zpětné lomítko se zamaskuje zpětným lomítkem nebo apostrofy čí uvozovkami:
$ echo \\/\\/\\/
\/\/\/
$
$ echo '\/\/\/'
\/\/\/
- Jedinou datovou strukturou je jednoduchá proměnná typu znakový řetězec
- poziční parametry
- uživatelské proměnné
- některé mají smluvený význam a jsou obhospodařovány shellem.
Poziční parametry shellu
- Obsahují argumenty příkazové řádky a značí se $0, $1,..., $9
- používají se v shellovských scénářích parametr $0 je název příkazu, jeho hodnotu $0 nemůže uživatel změnit
- $1 až $9 odpovídají argumentům arg1 až arg9 příkazové řádky
- má-li příkazová řádka více než deset argumentů arg10 atd. , zpřístupní se ve scénáři příkazem shift , kterýn přepíše hodnuty $1 a další argumenty přikazové řádky s císly a jedničku vyššími a minulou hodnotu $1 zapomene.
Např.
while [ $1 ]
do
echo $1
shift
done
Obecně lze použít povel ve tvaru shift [n]:
- $n-1 ponechává beze změny
- další argumenty příkazové řádky přesouvá do pozičních parametrů $n, $+1 a dalších.
Parametrům $1 a dalším lze explicitně přiřadit hodnotu příkazem set:
$ set Toto je pět pozičních parametrů
$ echo $1 $2 $2 $3 $4 $5
Toto je pět pozičních parametrů
Uživatelské proměnné
- Definují se přiřazením identifikátor=řetězec
- identifikátor může být tvořen sekvencí písmen, číslic a podtržítka, začínající písmenem nebo podtržítkem
- v přiřazovacím příkaze nesmí být před a za rovnítkem mezery
- proměnnou lze naplnit obsahem standardního výstupu příkazu: identifikátor=`příkaz`.
- Obsah proměnné pomocí $identifikátor
- ve složitějších výárazech, kde by mohlo dojít k nejednoznačnostem, uzavře se identifikátor do složených závorek {}
- ukládají-li se do proměnné mezery, tabulátory nebo nové řádky, pak se řetězec uzavře do uvozovek
- uvnitř uvozovek je ponechán znaku $ jeho význam jako odkazu na proměnnou
Př.
$ editor=joe
$ echo $editor
joe
$ dnesni_datum_a_cas=`date`
$ echo $den_a_cas
Mon Oct 14 10:23:45 GMT 1994
$ echo ${editor}-textový editor
joe-textový editor
Př. Skript vratny
den_a_cas=`date`
echo $den_a_cas
zapis="Vratny: ${1} ${den_a_cas}: kontrola objektu"
echo $zapis >> denik.sluzby
Na jednom řádku může být více přiřazovacích příkazů, které se vyhodnocují zprava doleva:
$ y = "y = ${x}" x ="f(x)"
$
$ echo $x
f(x)
$ echo $y
y=f(x)
Proměnné, které nastavuje shell a jež mohou být uživatelem modifikovány
Značí se velkými písmeny :
- HOME
- Domovský adresář uživatele. Je nastaven po přihlášení do systému programem login; k přepnutí do něj slouží příkaz cd bez parametrů.
- IFS
- Vnitřní oddělovač polí v shellu. Odděluje argumenty příkazové řádky shellu, příkazu read, set a pod. Počáteční nastavení: mezera, tabulátor a nová řádka.
- MAIL
- Úplná cestu souboru, sloužícího jako schránka pro elektronickou poštu.
- MAILCHECK
- Schránky elektronické pošty se prohlížejí každou MAILCHECK - tou sekundu
- MAILPATH
- Seznam úplných cest na další poštovní schránky, oddělené dvojtečkami
- PATH
- Seznam cest na adresáře v nichž hledá shell příkazy, oddělených dvojtečkou. Pořadí vyhledávání je dáno pořadím v seznamu. Standardně PATH=:/bin:/usr/bin, tedy aktuální adresář (prázdný argument), adresář /bin a adresář /usr/bin.
- PS1
- Primární výzva shellu; standardně $, následovaný mezerou, očekává se příkaz.
- PS2
- Sekundární výzva shellu, zobrazí se při pokračování příkazu na další řádce, očekává dokončení příkazu.
- SHELL
- cesta k aktuálnímu interpretu shellu
- TERM
- typ terminálu
- TZ
- označení časové zóny a její poloha vzhledem ke Greenwichskému poledníku
Průběžně akualizované proměnné
- ?
- Návratový kód posledního příkazu. U většiny příkazů po bezchybném provedení je roven nule
- #
- počet pozičních argumentů předaných do scénáře (argument příkazové řádky bez názvu scénáře)
- $
- číslo aktuálního prosesu (PID). Nejčastější použití je pro jednoznačné označení dočasných souborů- např. tempfile$$
- !
- číslo posledního procesu spuštěného v pozadí
- -
- aktuálně nastavené volby shellu ( zadané z příkazové řádky nebo povelem set.
Výpis všech proměnných
set
Zrušení proměnných
unset identifikátor [identifikátor...]
Proměnné, kterým byla přiřazena hodnota, jsou známe v aktuálním shellu,
předání do podřízených shellů příkazem
export [identifikátor...]
export
bez argumentů vypíše všechny proměnné, exportované z aktuálního shellu.
Zákaz přepsání:
- readonly [identifikátor...],
- bez argumentů vypíše všechny proměnné, označené jako readonly.