Úvod do UNIXu Jirka Boháč Gymnázium Jaroslava Seiferta j.bohac@gymjs.net 2003/2004 Abstrakt souborový systém, práce se shellem, přesměrování, job control, standardní unixové utility,...? Úvod do UNIXu
Operační systém UNIX vznik v 60. - 70. letech v Bell Labs pokračování vývoje v akademickém prostředí (Berkeley) víceuživatelský systém multitasking - běh více programů najednou přístupová práva k souborům práce více uživatelů zároveň - terminály autor předstíral vývoj kancelářského systému pr zpracování textu velké množství utilit pro práci s textem mnoho různých variant unixu open-source software varianty (linux, BSD) Úvod do UNIXu strana 1
Terminály z doby drahých a velkých sálových počítačů hloupé zařízení, zobrazuje (přidává) na obrazovku přijaté znaky a posílá počítači informaci o stisknutí klávesy chytřejší terminály uměly pohybovat kurzorem stovky různých druhů terminálů a jejich emulátorů (xterm) vzdálené přihlášení přes telnet/ssh grafické terminály (X-terminály) Úvod do UNIXu strana 2
Hierarchie souborového systému jediný kořen stromu VFS - virtual filesystem, mountování jiných FS různé typy souborů file (soubor) directory (adresář) symbolic link - symlink (odkaz) device (zařízení) named pipe cesta oddělena lomítky (slashes) absolutní/relativní cesta, aktuální adresář speciální adresáře. a.. Úvod do UNIXu strana 3
Shell - interpret příkazů jeden shell se spustí po přihlášení uživatele (login shell) čeká na uživatelovy příkazy, umí spouštět programy a manipulovat s běžícími programy. pokud skončí login shell, uživatel se odhlásí shell často umí i další funkce (cykly, podmínky, počítání,...) příkazy lze uložit do souboru a sputit dávkově - shell script nejpoužívanější UNIXový shell - bash (Bourne-Again SHell) Úvod do UNIXu strana 4
spuštění programu, parametry, man, help Ke spuštění programu stačí zadat jeho jméno. Programy mívají parametry, ovlivňující jejich chování. Parametry které jen zapínají nebo vypínají určitou funkci se nazývají přepínače (switches): -x Zadáním jména v shellu spustíme program nebo interní příkaz. prikaz -f parametr [nepovinný parametr]: Většina instalovaných programů má v systému manuál, popisující použití a parametry. K jeho zobrazení slouží program man: man [sekce] jméno programu K prohledávání hlaviček manuálových stránek je program apropos. Nápovědu k interním příkazům shellu získáme příkazem help příkaz, nebo z manuálové stránky shellu: man bash Úvod do UNIXu strana 5
Pohyb po adresářovém stromu: cd, ls, pwd cd Change Directory - příkaz shellu, který změní aktuální adresář: cd cesta pwd Print Working Directory - program, který vytiskne celou cestu k aktuálnímu adresáři ls List - vypíše obsah aktuálního adresáře ls [-l] [-d] [-a] [...] přepínač -l (long) ukáže podrobné informace o souborech, 1 na řádku přepínač -d (directory) ukáže informace o adresáři, namísto obsahu přepínač -a (all) ukáže i skryté soubory, začínající tečkou Úvod do UNIXu strana 6
Vytváření & mazání souborů: mkdir, touch, rmdir, rm mkdir [-p] cesta vytvoří adresář rmdir cesta smaže prázdný adresář touch cesta vytvoří prázdný soubor rm [-r] [-f] [-i] cesta smaže soubor (ne adresář). přepínač -r (recursive) povolí rekurzivní smazání celého podstromu (vše včetně adresářů) přepínač -i (interractive) zeptá se uživatele u každého souboru jestli to myslí vážně. V některých systémech je tento přepínač defaultně zapnut pro superuživatele (root) přepínač -f (force) ignoruje chyby, potlačuje volbu -i rm -rf / Úvod do UNIXu strana 7
Vstup a výstup programů K otevřeným souborům program interně přistupuje pomocí čísel (file descriptors), jejichž pole má každý program někde ve své paměti uloženo. Deskriptory číslo 0, 1 a 2 mají zvláštní postavení: 0 standardní vstup (standard input, stdin) většina programů ho používá jako vstupní data, pokud jim neřekneme že mají použít soubor 1 standardní výstup (standard output, stdout) většina programů na něj píše výsledek své práce, pokud jim neřekneme že mají použít soubor 2 standardní chybový výstup (standard error, stderr) Obvykle na něj program vypisuje případné chybové hlášky Úvod do UNIXu strana 8
Vstup a výstup programů - přesměrování Když jeden program spouští druhý, může mu nastavit příslušné filedescriptory jak chce. Shell, jako program určený na spouštění dalších programů, poskytuje mnoho možností jak stdin, stdout a stderr u spouštěných programů měnit. login-shell má většinou stdin připojen přes terminál na klávesnici, a stdout a stderr na terminálovou obrazovku. Pokud neurčíme při spouštění programů jinak, dědí se toto nastavení na synovské procesy (programy které spouštíme) Přesměrování do souboru: pomocí > se přesměruje stdout do souboru: program > výstupní soubor pomocí < se přesměruje stdin na soubor: program < vstupní soubor pomocí 2> se přesměruje stderr na soubor: program 2> soubor Úvod do UNIXu strana 9
program cat concatenate zřetězení souborů: cat [soubor1 [soubor2...]] pokud je spuštěn bez parametrů, čte ze stdin pokud nahradíme jeden ze souborů znakem -, bude se místo souboru číst stdin program všechny vstupní soubory pospojuje a vypíše na stdout Úvod do UNIXu strana 10
programy head, tail a wc head vypiš prvních n řádků vstupu (default=10) head -n počet řádků [ soubor1... ] tail vypiš posledních n řádků vstupu (default=10) tail -n počet řádků [ soubor1... ] wc word count umí počítat nejen slova ve vstupu: wc -l počítá počet řádek wc -w počítá počet slov wc -c počítá počet písmen Úvod do UNIXu strana 11
roura (pipe) Umožňuje přesměrovat výstup (stdout) jednoho programu na vstup (stdin) jiného programu. program1 [ parametry ] program2 [ parametry ]... Řetězit lze samozřejmě i více programů. Oba programu jsou spuštěny zároveň, a stdout prvního je přesměrován na stdin druhého Pokud druhý program skončí (například nějakou chybou), ukončí se i první Příklad: cat a.txt b.txt head -n 100 wc -w Slepí soubory a.txt a b.txt, z výsledku vezem prvních 100 řádek a spočítá kolik je v nich slov. Úvod do UNIXu strana 12
programy cut a sort cut vybere z každé řádky vstupu jen některé znaky ( -cseznam) nebo pole (-fseznam). Pokud se pracuje s poli (-f) tak je možné nastavit oddělovač (delimiter): -d oddělovač. Příklad: cut -d: -f 1,5 /etc/passwd vypíše login a skutečné jméno všech uživatelů systému. sort třídí vstup - defaultně třídí vzestupně podle abecedy celé řádky. -n třídí čísla (10 > 2) -k pozice1 [pozice2...] určuje pole podle kterého (kterých) se má třídit. -t oddělovač polí (totéž jako -d u cut) -r obrácené pořadí (reverse) Příklad: sort -t: -k 5 /etc/passwd setřídí uživatele podle jména Úvod do UNIXu strana 13
programy echo a tr echo vypíše svoje parametry na výstup -n neukončí řádku -e umožní tisk speciálních escape tr sada1 sada2 nahrazuje znaky ze sada1 znaky ze sada2. Příklad: tr A-Z a-z nahradí všechna velká písmena malými. Úvod do UNIXu strana 14
regulární výrazy - stručně Regulární výrazy (regular expressions, regexps) využívá mnoho programů jako způsob zadání vyhledávaného textu (a případně nahrazení). O textu který se dá výrazem vygenerovat se říká že mečuje s regulárním výrazem (matches a regexp). speciální znaky:. libovolný znak [seznam] libovolný ze znaků v seznamu. (např: [a-z0-9] jsou všechna malá písm [ˆseznam] libovolný znak, kromě znaků ze seznamu. * libovolný počet opakování posledního výrazu + dtto, ale alespoň jedno opakování (extenze) {n} n opakování {n,m} n až m opakování ˆ začátek (např. řádku) $ konec (např. řádku) Úvod do UNIXu strana 15
program grep grep regexp prohledává vstup, a tiskne jen řádky které obsahují řetězec mečující s regexp -i ignoruje malá a velká písmena -v inverze tiskne jen řádky neobsahující příslušný řetězec -r rekurzivně prohledává adresář... a mnoho dalších (viz man grep) Úvod do UNIXu strana 16
environment variables v shellu součástí každého běžícího procesu jsou jeho proměnné prostředí envronment variables proměnné jsou řetězcové, v některých případech můžou být interpretovány jinak (např. jako čísla) seznam nastavených proměnných vypíše příkaz set proměnné se nastavují operátorem = příklad: x=hodnota proměnné, jsou lokální pro proces; pokud chceme nějaké proměnné dostat do nově spuštěného programu (např. dalšího shellu), je třeba je exportovat příkazem export Úvod do UNIXu strana 17
expanze Některé speciální znaky mají při zpracování příkazové řádky zvláštní význam a způsobí, že část řádky je nahrazena nějakým jiným řetězcem. Expanze probíhají v následujícím pořadí: expanze složených závorek v závorkách je seznam slov, těmi je postupně v řetězci kolem závorky nahrazena celá závorka. příklad: mkdir /tmp/{aa,bb,cc} vytvoří adresáře /tmp/aa, /tmp/bb a /tmp/cc expanze vlnovky znak se nahradí obsahem proměnné HOME, tj. cestou k uživatelovu home-directory. Pokud není následován lomítkem, vezme se řetězec mezi a / jako uživatelské jméno, a výsledek je home-directory daného uživatele. Úvod do UNIXu strana 18
expanze (pokračování) expanze parametrů a proměnných ${jméno proměnné} je nahrazeno obsahem proměnné. Pokud je jméno proměnné číslo, chápe se jako parametr skriptu. Složené závorky je možno vynechat. Příklad: echo $x vypíše obsah proměnné x Při expanzi parametrů shell umožňuje mnoho dalších funkcí, např. doplňování defaultní hodnoty, podřetězce obsahu proměnné,... expanze výstupu: $(příkaz) nebo příkaz (zpětné apostrofy!) spustí příkaz a do příkazové řádky vloží celý jeho výstup příklad: cat echo a.txt vypíše obsah souboru a.txt aritmetická expanze $((výraz)) se nahradí spočteným výrazem Úvod do UNIXu strana 19
expanze (pokračování 2) expanze jmen souborů - pokud jsou nalezeny znaky *,?, nebo [, expanduje se slovo ve kterém se vyskytují na jména všech souborů, které lze ze slova dostat pomocí pravidel: znak * lze nahradit libovolnou (i prázdnou) posloupností znaků znak? lze nahradit právě jedním libovolným znakem [seznam] lze nahradit libovolným ze znaků v seznamu [!seznam] nebo [ˆseznam] lze nahradit libovolným ze znaků mimo seznam. Chování lze ještě ovlivnit nastavením různých proměnných a parametrů shellu (např. GLOBIGNORE) Příklad: rm [ab]*.txt smaže všechny soubory začínající na a nebo b, a končící na.txt Úvod do UNIXu strana 20
escape, quotes Často potřebujeme například programu zadat parametr, který obsahuje speciální symboly (symboly pro expanzi, pro přesměrování, mezeru, konec řádku,...). znak backslash (\) ruší speciální funkci následujícího znaku (tzv. escape ) uzavřením řetězce do apostrofů ( ) se ruší speciální význam všech znaků mezi nimi uzvřením řetězce do uvozovek ( ) se ruší význam speciálních znaků mezi nimi, s výjimkou dolaru ($), zpětného apostrofu( ), a backslashe(\) (ten má pak jen omezenou funkci) Všechny tyto znaky na příkazové řádce zrušeny po provedení expanze. Úvod do UNIXu strana 21
přístupová práva k souborům Součástí informace, ketrou si systém pamatuje o každém souboru je číslo uživatele (UID) vlstnícího soubor číslo skupiny (UID) vlastnící soubor sada devíti bitů, definující přístupová práva Devět bitů je rozděleno do tří trojic po třech bitech. První trojice definuje přístupová práva pro vlastníka souboru. Druhá trojice definuje práva pro členy skupiny, která soubor vlastní. No a třetí skupina Úvod do UNIXu strana 22
přístupová práva k souborům, význam bitů Každá trojice bitů, definující přístupová práva má následující význam: první (zprava!) bit, odpovídá právu čtení souboru (označován r) - u adresářů odpovídá právu prohlížení seznamu souborů v adresáři druhý bit odpovídá právu zápisu (w). U adresářů je to právo přidávat a mazat soubory. třetí bit má u souborů význam provádění (execute x) - je-li soubor skript nebo binární program, a máme na něj právo x, můžemej jej spustit. U adresářů nám dává tento bit právo použít jejich obsah (přistoupik k souboru můžeme i když adresář nemůžeme číst, jen musíme znát přesně jeho jméno Práva se obvykle zapisují ve formátu: rwxrw-r--, nebo v podobě čísla v osmičkové soustavě: 764... význam: rwx pro vlastníka, rw pro skupinu, a r pro všechny ostatní. Úvod do UNIXu strana 23
přístupová práva k souborům, povolení přístupu Když program po systému požaduje nějakou operaci se souborem, kontroluje systém práva v následujícím pořadí: pokud UID pod kterým je spuštěn program odpovídá UID souboru, použijí se bity odpovídající vlastníkovi prochází se všechny skupiny jejichž je UID běžícího programu členem. Pro každou se porovná její GID a GID souboru. Pokud souhlasí, použijí se práva pro skupinu. použíjí se práva pro ostatní Paradoxně, kvůli tomuto algoritmu, má li soubor práva např. r--rw-rw-, tak do něj vlastník nemůže zapisovat a všichni ostatní ano. Úvod do UNIXu strana 24
program chmod Přístupová práva se občas nazívají mód souboru. Program na jejich změnu se menuje chmod chmod -R práva soubor1 [soubor2... ] změní souborům práva podle parametru práva Práva můžeme určit buď absolutně (například číslem v osmičkové soustavě), a nebo přidat/ubrat práva k již existujícím právům. Například: chmod 644... nastaví práva na 664, tj rw-r--r-- chmod u+x... přidá uživateli (u=user), právo x chmod go+rw... přidá skupině a ostatním (g=group, o=other), práva rw chmod a+rx... přidá všem (a=ugo), práva rx Úvod do UNIXu strana 25
návratová hodnota příkazu Každý příkaz nebo program vrací číselnou hodnotu (return-value) Výsledek posledního provedeného příkazu je uložen v proměnné? Výsledek 0 je považován za úspěch, nenulový výsledek za chybu. Shell má logické operátory && (AND), (OR) a! (NOT) && a s částečným vyhodnocováním (tj. druhý z operandů se nevyhodnocuje, není li třeba). Toho se využívá k jednoduchým podmínkám: příkaz1 && příkaz2 příkaz2 se provede pokud příkaz1 uspěje příkaz1 příkaz2 příkaz2 se proved pokud příkaz1 neuspěje Úvod do UNIXu strana 26
podmínkové výrazy Konstrukce [[ výraz ]] vyhodnotí výraz a vrátí 0 nebo 1. Podporované výrazy např.: -a soubor 0 pokud soubor existuje -f adresář 0 pokud adresář existuje -f adresář 0 pokud adresář existuje -z string 0 pokud string je prázdný string1 == string2 0 pokud jsou řetězce shodné string1!= string2 0 pokud jsou řetězce různé a mnoho dalších... viz CONDITIONAL EXPRESSIONS v dokumentaci k bashi Úvod do UNIXu strana 27
podmínky Ke složitějším podmínkám, kde nestačí && a, můžeme použít konstrukci if/then/else: if příkazy ; then příkazy2 ;fi nebo if příkazy ; then příkazy1 ;else příkazy2 ; fi Provedou se příkazy, a podle výsledku posledního z nich se provede/neprovede příslušná větev příkazy1 nebo příkazy2 Úvod do UNIXu strana 28
while cyklus, příkaz read while příkazy ; do příkazy2 ; done Provádí příkazy2 dokud poslední z příkazy vrací 0 (úspěch) while-cyklus se často používá s příkazem read. read proměnná1 [proměnná2... ] načte ze vstupu řádku textu, první slovo dá do první proměnné, druhé do druhé... do poslední proměnné dá celý zbytek řádky. Oddělovač slov je definován v proměnné IFS (standardně mezera/tab) IFS=: while read login pw uid gid fn home shell; do echo $fn $login; done </etc/passwd Vytiskne jména a loginy všech uživatelů Úvod do UNIXu strana 29
for cykly bash má dva typy for cyklů: standardní for jako v C for ((i=0; i< 10; ++i)) do...; done iterační: for proměnná in a b c d ; do...; done postupně do proměnné přiřadí a b c d, a provede vždy jednu iteraci cyklu. velmi hojně využívaný cyklus, například pro manipulaci se soubory: for i in *; do mv "$i" "$i.bak"; done přidá všem souborům na konec jména.bak Úvod do UNIXu strana 30