ˇ systémy Operacní IOS 2010/2011
Tomáš Vojnar vojnarfit.vutbr. z
ˇ Vysoké ucení technické v Brneˇ ˇ Fakulta informacních technologií ˇ Božetechova 2, 612 66 Brno
Shell a utlity UNIXu – p.1/66
Programování v UNIXu: pˇrehled
Shell a utlity UNIXu – p.2/66
Nástroje programátora ❖ Prostˇredí pro programování zahrnuje:
• • • • • • • •
API OS a ruzných ˚ aplikaˇcních knihoven,
API = aplikační rozhraní
CLI a GUI, editory, pˇrekladaˇce a sestavovaˇce/interprety, ladící nástroje, nástroje pro automatizaci pˇrekladu, ... dokumentace.
❖ CLI a GUI v UNIXu:
• CLI: shell (sh, ksh, csh, bash, dash, ...) • GUI: X-Window
textová příkazová řádka
Shell a utlity UNIXu – p.3/66
X-Window Systém ❖ Základní charakteristiky:
není součástí jádra
• grafické rozhraní typu client-server, nezávislé na OS, umožnující ˇ vzdálený pˇrístup, (organizace) • otevˇrená implementace: XFree86/X.Org, • mechanismy, ne politika — výhoda cˇ i nevýhoda? různé tvary oken, tlačítek,.. postaveny nad základními mechanismy
❖ X-server: zobrazuje grafiku, ovládá grafický HW, myš, klávesnici...; s aplikacemi a správcem oken komunikuje pˇres X-protokol. komponenty X-Window System mohou běžet na různých uzlech v síti ˇ ˇ ❖ Window Manager: správce oken (dekorace, zmena pozice/rozmeru, ...); s aplikacemi komunikuje pˇres ICCM protokol (Inter-Client Communication Protocol). ❖ Knihovna xlib: standardní rozhraní pro aplikace, implementuje X-protokol, ICCM, ...
X−application
X−server
xlib libc kernel HW
libc kernel HW
X−protocol Network
X-server musí běžet na uzlu, ke kterému je připojen vstup/výstup
Display Keyboard Shell a utlity UNIXu – p.4/66
Vzdálený pˇrístup pˇres X-Window ˇ aplikace s GUI ze vzdáleného poˇcítaˇce: ❖ Spuštení
• lokální systém: xhost + ... • vzdálený systém: export DISPLAY=... a spuštení ˇ aplikace • tunelování pˇres ssh: ssh -X ❖ Vnoˇrené GUI ze vzdáleného poˇcítaˇce: Xnest. ❖ Konkurence X-Window pro vzdálený pˇrístup – mj. VNC (Virtual Network Computing): ˇ vzdálený grafický pˇrístup, client-server systém, možnost odpojení a zpetného pˇripojení klienta k serveru, pˇrenos bitmap, nezávislé na OS, implementováno i pod X-Window.
Shell a utlity UNIXu – p.5/66
Editory, vim
u - undo
ˇ ❖ Textové editory bežné v UNIXu:
• v terminálu: vi, vim, ema s, ... • grafické: gvim, xema s, nedit, ... ❖ Tˇri režimy vi, vim:
přechod na insert mode a - append (a - za aktuální znak, A - na konec řádku) i - insert (i - před aktuální znak, I - na začátek řádku) o - nový řádek (o - za aktuální řádek, O - před aktuální řádek) r - replace (r - nahraď aktuální znak, R - od následující pozice dál) přechod na režim příkazové řádky q - ukonči q! - ukonči i když proběhly změny wq - ulož a ukonči
p,P,yy,... Shift+ZZ Command mode a,i,o,r, A,I,O,R,...
: Esc
Esc, Enter q,q!,wq,...
Insert mode
Command line
editing
Shell a utlity UNIXu – p.6/66
Užiteˇcné pˇríkazy ve vim ❖ Mazání – smaže a vloží do registru:
• • • • • •
znak: x/X ˇrádek: dd konec/zaˇcátek ˇrádku: dEnd / dHome konec/zaˇcátek slova: dw / db konec/zaˇcátek odstavce: d} / d{ do znaku: dt znak
ˇ ❖ Zmena: r, R a
, w, b, +End/Home, }, t+ukonˇcující znak, ... ❖ Vložení textu do registru: yy, yw, y}, yt+ukonˇcující znak, ... ❖ Vložení registru do textu: p/P ❖ Bloky: (Shift-V+šipky)/(Ctrl-V+šipky)+y /d, ...
Shell a utlity UNIXu – p.7/66
❖ Vícenásobná aplikace: cˇ íslo+pˇríkaz (napˇr. 5dd) ❖ undo/redo: u /Ctrl-R ❖ Opakování posledního pˇríkazu: . (teˇcka) ❖ Vyhledání: / regulární výraz ❖ Aplikace akce po vzorek: d/ regulární výraz
Shell a utlity UNIXu – p.8/66
Regulární výrazy ❖ Regulární výrazy jsou nástrojem pro koneˇcný popis pˇrípadneˇ nekoneˇcné množiny ˇretezc ˇ u. ˇ je velmi široké – nejde jen o vyhledávání ve vim! ˚ Jejich uplatnení ❖ Základní regulární výrazy (existují také rozšíˇrené RV – viz dále): znak
význam
obyˇcejný znak . * [množina] [^množina] \ ^ $ [[:k :]]
daný znak libovolný znak 0 − n výskytu˚ pˇredchozího znaku znak z množiny, napˇr: [0-9A-Fa-f] ˇ množiny znak z doplnku ruší ˇrídicí význam následujícího znaku zaˇcátek ˇrádku konec ˇrádku znak z dané kategorie k podle locale
:alpha:, :lower:, :digit: ...
❖ Pˇríklad: "^ *\* [0-9][0-9]* *$" hledej řádky, které libovolným počtem mezer, následuje hvězdička, právě jedna mezera, pak číslo tvořeno alespoň jednou číslicí, na závěr libovolný počet mezer Shell a utlity UNIXu – p.9/66
Pˇríkazová rˇádka ve vim ❖ Uložení do souboru: w, pˇrípadneˇ w! ˇ ˇrádky s/ regulární výraz / regulární výraz (/g) ❖ Vyhledání a zmena: ❖ Adresace ˇrádku: ˚ cˇ íslo ˇrádku, interval (x,y), aktuální ˇrádek (.), poslední ˇrádek ($), ˇ ˇ (/ˇretezec /), nejbližší pˇredchozí všechny ˇrádky (%), nejbližší další ˇrádek obsahující ˇretezec ˇrádek obsahující ˇretezec ˇ ˇ (?ˇretezec ?) ˇ ❖ Pˇríklad – vydelení cˇ ísel 10: :%s/\([0-9]*\)\([0-9]\)/\1.\2/ pro všechny řádky aplikuj: najdi libovolný počet číslic 0-9, po kterém následuje právě jedna číslice 0-9, nahraď tak, že za první číslici dáš tečku (desetinnou čárku), po které následuje desetinná část
Shell a utlity UNIXu – p.10/66
Základní dokumentace v UNIXu ❖ man, info, /usr/share/do , /usr/lo al/share/do , HOWTO, FAQ, ..., README, INSTALL, ... ˇ ❖ man je rozdelen do sekcí (man n name): 1. Executable programs or shell commands 2. System calls (functions provided by the kernel) 3. Library calls (functions within program libraries) 4. Special files (usually found in /dev) 5. File formats and conventions, e.g., /et /passwd 6. Games 7. Miscellaneous (including macro packages and conventions) 8. System administration commands (usually only for root) 9. Kernel routines (Non standard) ❖ apropos name – kde všude se v man mluví o name. Shell a utlity UNIXu – p.11/66
Bourne shell 1. shell - interpretovaný programovací jazyk 2. shell - interpret jazyka shell
Shell a utlity UNIXu – p.12/66
❖ Skriptování:
• • • •
Interpret: program, který provádí cˇ innost popsanou v souboru–programu. Skript: textový soubor s programem pro interpret. Nevýhody: pomalejší, je tˇreba interpret. Výhody: nemusí se pˇrekládat (okamžiteˇ spustitelné), cˇ itelný obsah programu.
interaktivní shell - vstup / výstup spojený s terminálem, načítá vstup z klávesnice, vypisuje výstup na displej neinteraktivní shell - načítá příkazy z programu, výstupy vypisuje do souboru
ˇ skriptu v UNIXu: ❖ Spuštení sh skript.sh
# explicitn´ ı vol´ an´ ı interpretu
sh může odkazovat na různý shell na různých systémech
chmod +x skript.sh ./skript.sh
# nastav´ ı pˇ rı ´znak spustitelnosti # spuˇ stˇ en´ ı shell spustí nový shell, po skončení programu jej zase ukončí,
. ./skript.sh
# spuˇ stˇ en´ ı v aktu´ aln´ ım shellu
nelze například nastavovat prostředí - zahodí se
Shell a utlity UNIXu – p.13/66
❖ “Magic number” = cˇ íslo uvedené na zaˇcátku souboru a charakterizující jeho obsah:
• U spustitelných souboru˚ jádro zjistí na základeˇ magic number, jak soubor spustit: ˇ ˚ zevedení do pameti, tj. u binárních programu˚ jejich formát urˇcující zpusob u intepretovaných programu˚ pak, který interpret použít (první ˇrádek: #!/ esta/interpret).
• Výhoda: možnost psát programy v libovolném skriptovacím jazyku. ❖ Pˇríklady: #!/bin/sh
- skript pro Bourne shell
#!/bin/ksh #!/bin/csh
- skript pro Korn shell - skript pro C shell
#!/usr/bin/perl #!/usr/bin/python
- skript v Perlu - skript v Pythonu
\177ELF
- bin´ arn´ ı program - form´ at ELF
Shell a utlity UNIXu – p.14/66
Speciální znaky (metaznaky) ˇ ❖ Jsou interpretovány shellem, znamenají provedení nejaké speciální operace. ˇ eˇ pˇred speciálním znakem. ❖ Jejich speciální význam lze zrušit napˇríklad znakem \ tesn
❖ Poznámky: znak
význam a pˇríklad použití
#
poznámka do konce ˇrádku echo "text" # pozn´ amka
Shell a utlity UNIXu – p.15/66
ˇ ❖ Pˇresmerování vstupu a výstupu: znak >
význam a pˇríklad použití ˇ pˇresmerování výstupu, pˇrepíše soubor standardně propojeno s terminálem
echo "text" >soubor # pˇ resmˇ erov´ an´ ı stdout pˇ rı ´kaz 2>soubor # pˇ resmˇ erov´ an´ ı stderr pˇ rı ´kaz [n]>soubor
# n je ˇ cı ´slo, implicitnˇ e 1
ˇ Císla zde slouží jako popisovaˇce otevˇrených souboru˚ (file handle). Standardneˇ používané a otevírané popisovaˇce:
• stdin=0 • stdout=1 • stderr=2
standardní vstup (klávesnice) std. výstup (obrazovka) std. chybový výstup (obrazovka)
Shell a utlity UNIXu – p.16/66
znak >&
>>
význam a pˇríklad použití duplikace popisovaˇce pro výstup echo "text" >&2 pˇ rı ´kaz >soubor 2>&1 pˇ rı ´kaz 2>&1 >soubor
# # # #
stdout pˇ resm. stdout stderr
do stderr stderr i stdout do souboru, nejprve přesměruje stderr na stdout, až pak na obrazovku stdout do souboru
m>&n
# m a n jsou ˇ cı ´sla
ˇ pˇresmerování výstupu, pˇridává do souboru echo "text" >> soubor pˇ rı ´kaz 2>>log-soubor
Shell a utlity UNIXu – p.17/66
znak <
význam a pˇríklad použití ˇ pˇresmerování vstupu pˇ rı ´kaz < soubor
<
ˇ pˇresmerování vstupu, cˇ te ze skriptu až po token, který musí být samostatneˇ na ˇrádku – tzv. “here document” cat >soubor <<__END__ jak´ ykoli text, i $PROMENNA kromˇ e ukonˇ covac´ ıho ˇ ra ´dku __END__ musí být na začátku řádku
výstup přesměruje do souboru, vstup načítá ze sebe samého (následující část skriptu) až po značku __END__ dosazuje hodnoty proměnných, provádí zanořené příkazy
Varianty: <<\token
quoting jako ’, dále žádná expanze
<<-token
možno odsadit tabelátory
Shell a utlity UNIXu – p.18/66
❖ Zástupné znaky ve jménech souboru: ˚ znak *
význam a pˇríklad použití zastupuje libovolnou sekvenci libovolných znaku, ˚ shell vyhledá všechna odpovídající jména souboru: ˚ ls *.c ls *archiv*gz ls .*/*.conf
# skryt´ e soubory .*
Poznámka: Není nutné v každém programu zpracovávat tyto expanzní znaky. Poznámka: Pozor na limit délky pˇríkazového ˇrádku! ?
zastupuje libovolný (jeden) znak jména souboru ls x???.txt ls soubor-?.txt
[mnoˇ zina]
zastupuje jeden znak ze zadané množiny ls [A-Z]* ls soubor-[1-9].txt
Shell a utlity UNIXu – p.19/66
❖ Skládání pˇríkazu: ˚ znak ‘pˇ rı ´kaz‘
význam a pˇríklad použití
|
ˇ pˇresmerování stdout procesu na stdin dalšího procesu, slouží pro vytváˇrení kolon procesu-filtr ˚ u: ˚ paralelní provádění ls | more cat /etc/passwd | obsah /etc/passwd se rozdělí podle ":", pro každý řádek první část souboru, tedy přihlašovací jména, ty awk -F: ’{print $1}’ | sort vytiskne seřadí podle abecedy pˇ rı ´kaz | tee soubor | pˇ rı ´kaz
ˇ eno ˇ je zamen za standardní výstup pˇríkazu (command substitution) příkaz se provede, výstup se dosadí do '' -> sh vypíše cestu k sh, ls pak ls -l ‘which sh‘ zobrazí údaje např. o /bin/sj DATUM=‘date +%Y-%m-%d‘ # ISO form´ at zjistí aktuální datum a uloží do proměnné echo Pˇ rihl´ as ˇeno ‘who|wc -l‘ uˇ zivatel˚ u
Shell a utlity UNIXu – p.20/66
znak ;
význam a pˇríklad použití sekvence pˇríkazu˚ na jednom ˇrádku ls ; echo ; ls /
||
ˇ provede následující pˇríkaz, pokud pˇredchozí neuspel (exitcode<>0) cc program.c || echo Chyba pˇ rekladu
&&
ˇ provede následující pˇríkaz, pokud pˇredchozí uspel (exitcode=0) cc program.c && ./a.out
Shell a utlity UNIXu – p.21/66
ˇ pˇríkazu: ❖ Spouštení ˚ znak (pˇ rı ´kazy)
význam a pˇríklad použití spustí subshell, který provede pˇríkazy ( echo "Text: " cat soubor echo "konec" ) > soubor2
&
nelze načítat standardní vstup, není napojen na subshell
spustí pˇríkaz na pozadí (pozor na výstupy programu) program &
ˇ ❖ Práce s promennými: $
ˇ hodnoty promenné ˇ zpˇrístupnení echo $TERM
Shell a utlity UNIXu – p.22/66
❖ Rušení významu speciálních znaku˚ (quoting):
• Znak \ ruší význam jednoho následujícího speciálního znaku (i znaku "nový ˇrádek"). echo \* text \* \\ echo "fhgksagdsahfgsjdagfjkdsaagjdsagjhfdsa\ jhdsajfhdsafljkshdafkjhadsk" echo 5 \> 2 text \$TERM
• Uvozovky "" ruší význam speciálních znaku˚ krome: ˇ $prom¥nná, `p°íkaz` a \. echo echo echo echo echo
3 * 4 = 12 # chyba, pokud # jsou v adres´ ar ˇi soubory "3 * 4 = 12" "Dneˇ sn´ ı datum: ‘date‘" "PATH=$PATH" "\ <\"test\"> *** ‘date‘ *** $PATH *** "
• Apostrofy ruší speciální význam všech znaku˚ v ˇretezci. ˇ echo ’$<>*‘ jak´ ykoli text kromˇ e apostrofu ’ echo ’toto ->’\’’<- je apostrof’ echo ’*\** \" $PATH ‘ls‘ <> \’ Shell a utlity UNIXu – p.23/66
Postup pˇri hledání pˇríkazu˚ ˇ ❖ Po zadání pˇríkazu postupuje shell následovne: 1. Test, zda se jedná o funkci nebo zabudovaný pˇríkaz shellu (napˇr. d), a pˇrípadné provedení této funkce/pˇríkazu. 2. Pokud se jedná o pˇríkaz zadaný i s cestou (napˇr. /bin/sh), pokus provést program s pˇríslušným jménem v pˇríslušném adresáˇri. 3. Postupné prohlížení adresáˇru˚ v PATH. 4. Pokud program nenalezne nebo není spustitelný, hlásí chybu.
❖ Poznámka: Vlastní pˇríkazy do $HOME/bin a pˇridat do PATH.
Shell a utlity UNIXu – p.24/66
ˇ pˇríkazy Vestavené ˇ ❖ Které pˇríkazy jsou vestavené závisí na použitém interpretu. ❖ Pˇríklad: d, wait, ... ❖ Výhoda: rychlost provedení. ˇ ❖ Ostatní pˇríkazy jsou bežné spustitelné soubory.
Shell a utlity UNIXu – p.25/66
Pˇríkaz eval ❖ eval p°íkaz:
• Jednotlivé argumenty jsou naˇcteny (a je proveden jejich rozvoj), výsledek je konkatenován, znovu naˇcten (a rozvinut) a proveden jako nový pˇríkaz.
• Možnost za behu ˇ sestavovat pˇríkazy (tj. program) na základeˇ aktuálneˇ cˇ teného obsahu souboru, vstupu od uživatele apod.
❖ Pˇríklady: echo "text > soubor" eval echo "text > soubor" eval ‘echo x=1‘ ; echo "x=$x" read X; eval echo "$"$X - vypíše obsah proměnné s názvem X
Shell a utlity UNIXu – p.26/66
Ukonˇcení skriptu ❖ Ukonˇcení skriptu: exit [£íslo℄
• vrací exit-code £íslo nebo exit-code pˇredchozího pˇríkazu, • vrácenou hodnotu lze zpˇrístupnit pomocí $?, • možné hodnoty: – 0 – O.K. – <>0 – chyba
ˇ nového kódu: exe p°íkaz: ❖ Spuštení
• nahradí kód shellu provádejícího ˇ exe kódem daného pˇríkazu, • spuštení ˇ zadaného programu je rychlé – nevytváˇrí se nový proces, • bez parametru umožnuje ˇ ˇ pˇresmerování vstupu/výstupu uvnitˇr skriptu. např. během programu: exec < blabla - přesměruje vstup programu z souboru blabla
Shell a utlity UNIXu – p.27/66
Správa procesu˚ ps nohup kill wait
výpis stavu procesu˚ proces nekonˇcí pˇri odhlášení posílání signálu˚ procesum ˚ cˇ eká na dokonˇcení potomka/potomku˚
❖ Pˇríklady: ps ax nohup program kill -9 1234
# vˇ sechny procesy # pozor na vstup/v´ ystup # nelze odm´ ıtnout
Shell a utlity UNIXu – p.28/66
Subshell ❖ Subshell se spouští v pˇrípadeˇ použití: ./skript.sh (pˇ rı ´kazy)
ˇ skriptu (i na pozadí) spuštení skupina pˇríkazu˚
ˇ promenné ˇ ˇ lokální promenné ˇ ❖ Subshell dedí prostˇredí, nededí (tj. ty, u kterých nebyl proveden export). ˇ promenných ˇ ❖ Zmeny a dalších nastavení v subshellu se neprojeví v puvodním ˚ shellu! ❖ Provedení skriptu aktuálním interpretem:
• pˇríkaz . • napˇr. . skript ❖ Posloupnost pˇríkazu˚ { p°íkazy } – stejné jako ( ), ale nespouští nový subshell.
Shell a utlity UNIXu – p.29/66
❖ Pˇríklad – možné použití { } (a souˇcasneˇ demonstrace jedné z programovacích technik používaných v shellu): # Changing to a log directory. cd $LOG_DIR if [ "‘pwd‘" != "$LOG_DIR" ]
# or if [ "$PWD" != "$LOG_DIR" ] # Not in /var/log?
then echo "Cannot change to $LOG_DIR." exit $ERROR_CD fi # Doublecheck if in right directory, before messing with log file. # However, a far more efficient solution is: cd /var/log || { echo "Cannot change to $LOG_DIR." >&2 exit $ERROR_CD; }
pokud příkaz cd neuspěje, vykonají se příkazy v { }
Shell a utlity UNIXu – p.30/66
ˇ Promenné ˇ ❖ Rozlišujeme promenné:
• lokální (nededí ˇ se do subshellu) PROM=hodnota PROM2="hodnota s mezerami"
• promenné ˇ ˇ se do subshellu) prostˇredí (dedí PROM3=hodnota export PROM3
# mus´ ıme exportovat do prostˇ red´ ı
❖ Pˇríkaz export:
• export seznam_prom¥nný h • exportuje promenné ˇ ˇ subshell, do prostˇredí, které dedí • bez parametru vypisuje obsah prostˇredí.
Shell a utlity UNIXu – p.31/66
ˇ ❖ Pˇrehled standardních promenných: $HOME
jméno domovského adresáˇre uživatele
$PATH
seznam adresáˇru˚ pro hledání pˇríkazu˚
$MAIL
úplné jméno poštovní schránky pro e-mail
$USER
login jméno uživatele
$SHELL
úplné jméno interpretu pˇríkazu˚
$TERM
typ terminálu (viz termcap/terminfo)
$IFS
ˇ obsahuje oddelovaˇ ce položek na pˇríkazové ˇrádce – implicitneˇ mezera, tabelátor a nový ˇrádek
$PS1
výzva interpretu na pˇríkazové ˇrádce – implicitneˇ znak $
$PS2
výzva na pokraˇcovacích ˇrádcích – implicitneˇ znak >
Shell a utlity UNIXu – p.32/66
ˇ ❖ Další standardní promenné: $$
cˇ íslo = PID interpretu
$0
jméno skriptu (pokud lze zjistit)
$1..$9
argumenty pˇríkazového ˇrádku (dále pak ${n} pro n ≥ 10)
$*/$@
všechny argumenty pˇríkazového ˇrádku
"$*"
všechny argumenty pˇríkazového ˇrádku jako 1 argument v ""
"$@"
všechny argumenty pˇríkazového ˇrádku, individuálneˇ v ""
$#
poˇcet argumentu˚
$?
exit-code posledního pˇríkazu
$!
PID posledního pˇríkazu na pozadí
$-
aktuální nastavení shellu
Shell a utlity UNIXu – p.33/66
❖ Pˇríklady: echo echo echo echo
"skript: $0" prvn´ ı argument: $1 vˇ sechny argumenty: $* PID=$$
ˇ ❖ Použití promenných: $PROM text ${PROM}text ${PROM-word} ${PROM+word} ${PROM=word} ${PROM?word}
ˇ mezi jménem a dalším textem musí být oddelovací znak ˇ není nutný další oddelovaˇ c word pokud nenastaveno pokud proměnná nemá hodnotu, použije se word word pokud nastaveno, jinak nic pokud má proměnná hodnotu, použije se word pokud nenastaveno, pˇriˇradí a použije word pokud nenastaveno, tisk chybového hlášení word a konec (exit)
Shell a utlity UNIXu – p.34/66
❖ Pˇríkaz env:
• env nastavení_prom¥nný h program [argumenty℄ • spustí program s nastaveným prostˇredím, • bez parametru˚ vypíše prostˇredí.
ˇ ❖ Promenné pouze pro cˇ tení:
• readonly seznam_prom¥nný h • oznaˇcí promenné ˇ pouze pro cˇ tení, • subshell toto nastavení nededí. ˇ
❖ Posun argumentu˚ skriptu:
• pˇríkaz shift, • posune $1 <- $2 <- $3 ...
Shell a utlity UNIXu – p.35/66
ˇ Ctení ze standardního vstupu ˇ ❖ Pˇríkaz read seznam_prom¥nný h cˇ te ˇrádek ze stdin a pˇriˇrazuje slova do promenných, do poslední dá celý zbytek vstupního ˇrádku. ❖ Pˇríklady: echo "x y z" | (read A B; echo "A=’$A’
B=’$B’")
IFS=","; echo "x,y z" | (read A B; echo "A=’$A’
A=x B=yz
B=’$B’") změní oddělovač slov, A = x
IFS=":"; head -1 /etc/passwd | (read A B; echo "$A")
B=yz
A = login prvního uživatele = root
Shell a utlity UNIXu – p.36/66
ˇ Pˇríkazy vetvení ❖ Pˇríkaz if:
vyhodnocuje se podle návratového kódu posledního příkazu
if seznam pˇ rı ´kaz˚ u then seznam pˇ rı ´kaz˚ u elif seznam pˇ rı ´kaz˚ u then seznam pˇ rı ´kaz˚ u else seznam pˇ rı ´kaz˚ u fi
Pˇríklad použití: if [ -r soubor ]; then cat soubor else echo soubor nelze ˇ cı ´st fi
Shell a utlity UNIXu – p.37/66
Testování podmínek ❖ Testování podmínek:
• konstrukce test výraz nebo [ výraz ℄, • výsledek je v $?. výraz -d file -f file -l string -n string string -z string -r file -w file -x file -t fd např. stdin, stdout..
0 = true <> 0 = false
význam je adresáˇr není adresáˇr ˇ délka ˇretezce ˇ neprázdný ˇretezec ˇ neprázdný ˇretezec ˇ prázdný ˇretezec je cˇ itelný soubor je zapisovatelný soubor je proveditelný soubor deskriptor fd je spojen s terminálem
výraz str1 = str2 str1 != str2 int1 -eq int2 int1 -ne int2 int1 -gt int2 int1 -ge int2 int1 -lt int2 int1 -le int2 ! expr expr1 -a expr2 expr1 -o expr2 \( \)
význam ˇ u˚ rovnost ˇretezc ˇ u˚ nerovnost ˇretezc rovnost cˇ ísel nerovnost cˇ ísel > >= < <= negace výrazu and or závorky
Shell a utlity UNIXu – p.38/66
❖ Pˇríkaz ase: case v´ yraz in vzor { | vzor }* ) seznam pˇ rı ´kaz˚ u ;; esac
Pˇríklad použití: echo -n "zadejte ˇ cı ´slo: " read reply case $reply in "1") echo "1" ;; "2"|"4") echo "2 nebo 4" ;; *) echo "nˇ eco jin´ eho" ;; esac * je expanze, ne regulární výraz
Shell a utlity UNIXu – p.39/66
Cykly ❖ Cyklus for: for identifik´ ator [ in seznam slov ] do seznam pˇ rı ´kaz˚ u done
Pˇríklad použití: for i in *.txt ; do echo Soubor: $i done
# bez []: $1 ...
*.txt - všechny .txt soubory v adresáři, postupně prochází všechna jména
Shell a utlity UNIXu – p.40/66
❖ Cyklus while: while seznam pˇ rı ´kaz˚ u # posledn´ ı exit-code se pouˇ zije do seznam pˇ rı ´kaz˚ u done
rozhoduje se podle posledního návratového kódu
Pˇríklad použití: while true ; do date; sleep 1 done
❖ Cyklus until: until seznam pˇ rı ´kaz˚ u # posledn´ ı exit-code se pouˇ zije do seznam pˇ rı ´kaz˚ u done
Shell a utlity UNIXu – p.41/66
❖ Ukonˇcení/pokraˇcování cyklu: break, continue
break - ukončí provádění cyklu continue - přejde na další iteraci cyklu
❖ Pˇríklady: stop=-1 while [ $stop -ne 0 ]; do echo -n "zadejte ˇ cı ´slo: " read stop echo $stop if [ $stop -ge 10 ] ; then echo "pˇ rı ´liˇ s velk´ e" break fi done
Shell a utlity UNIXu – p.42/66
Zpracování signálu˚ ❖ Pˇríkaz trap:
• trap [p°íkaz℄ {signál}+ man 7 signal - seznam signálů • pˇri výskytu signálu provede pˇríkaz, • pro ladení ˇ lze užít trap p°íkaz DEBUG. DEBUG - vyvolá se po každém příkazu
❖ Pˇríklad zpracování signálu: #!/bin/sh trap ’echo Ctrl-C; exit 1’ 2
# ctrl-C = sign´ al ˇ c.2
while true; do echo "cykl´ ıme..." sleep 1 done
Shell a utlity UNIXu – p.43/66
Vyhodnocování výrazu˚ true = 1
❖ Pˇríkaz expr výraz: false = 0
• Vyhodnotí výraz, komponenty musí být oddeleny ˇ mezerami (pozor na quoting!). • Operace podle priority: \* + = \& \|
/ \>
% \>=
\<
\<=
!=
• Lze použít závorky: \( \) ❖ Pˇríklady: V=‘expr 2 + expr 1 = 1
3 \&
\* 4‘ ; echo $V 0 != 1 ; echo $?
V = 14, vypíše 14 expr vypíše 1, protože hodnota expr je true, nastavuje návratový kód na true, což už je pro shell zase 0, $? tedy vypíše 0 (návratová hodnota posledního příkazu)
expr "$P1" = "$P2" # test obsahu promˇ enn´ ych V=‘expr $V + 1‘
je vhodné uzavírat do " "
# V++ Shell a utlity UNIXu – p.44/66
ˇ ezcové ˇ ❖ Ret operace v expr: String : Regexp match String Regexp ˇ který vyhovuje Regexp, nebo 0 – vrací délku podˇretezce, substr String Start Length ˇ od zadané pozice – získá podˇretezec index String Charlist – vrací pozici prvního znaku ze seznamu, který se najde length String ˇ – vrací délku ˇretezce
Shell a utlity UNIXu – p.45/66
Korn shell – ksh ❖ Rozšíˇrení Bourne shellu, POSIX shell (starší verze ksh88 základem pro definici ˇ v bash-i. POSIX), jeho duležité ˚ vlastnosti jsou zabudovány rovnež ❖ Pˇríkaz alias: alias rm=’rm -i’ ❖ Historie pˇríkazu: ˚
• možnost vracet se k již napsaným pˇríkazum ˚ a editovat je (bash: viz šipka nahoru a dolu˚ a R.) ctrl + r = "vyhledávání" napsaných příkazů ❖ Vylepšená aritmetika:
• pˇríkaz let, napˇr. let "x=2*2", • operace: + - * / % ! < > <= >= == != = ++ • zkrácený zápis a vyhodnocení bez spouštení ˇ dalšího procesu: (( x=2 )) (( x=2*x )) (( x++ )) echo $x vytiskne 5 Shell a utlity UNIXu – p.46/66
❖ Speciální znak “vlnovka”: ~ ~user ~+ ~-
$HOME $PWD $OLDPWD
domovský adresáˇr domovský adresáˇr daného uživatele pracovní adresáˇr pˇredchozí prac. adresáˇr
❖ Primitivní menu: select identifik´ ator [in seznam slov] do select x in "prvni moznost " "druha moznost" "treti moznost (konec)" do seznam pˇ rı ´kaz˚ u echo $x done if [ "$x" = "treti moznost (konec)" ] ; then break; fi done
– funguje jako cyklus; nutno ukonˇcit!
Shell a utlity UNIXu – p.47/66
❖ Vylepšené testování: [[ ]] (v´ yraz) v´ yraz && v´ yraz v´ yraz || v´ yraz
nemusíme používat \ uvnitř [[ ]]
Zbytek stejneˇ jako test. ❖ Substituce pˇríkazu: ˚ ‘command‘
$(command)
❖ Pole: declare -a p p[1]=a echo ${p[1]}
# pole (deklarace je nepovinn´ a) declare -A = asociativní pole
Shell a utlity UNIXu – p.48/66
❖ Pˇríkaz printf: formátovaný výpis na standardní výstup.
❖ Zásobník pro práci s adresáˇri:
• pushd – uložení adresáˇre do zásobníku, • popd – pˇrechod do adresáˇre z vrcholu zásobníku, • dirs – výpis obsahu zásobníku.
Shell a utlity UNIXu – p.49/66
❖ Pˇríkaz set
• bez parametru˚ vypíše promenné, ˇ • jinak nastavuje vlastnosti shellu: parametr
-n -u -v -x --
akce neprovádí pˇríkazy ˇ chyba pokud promenná není definována opisuje cˇ tené pˇríkazy ˇ opisuje provádené pˇríkazy další znaky jsou argumenty skriptu
• vhodné pro ladení ˇ skriptu. ˚ ❖ Pˇríklady: set -x -- a b c * for i ; do echo $i; done
za * nahradí všechny soubory v adresáři
Shell a utlity UNIXu – p.50/66
Omezení zdroju˚ ˇ shellu (a jeho uživateli) provádet ˇ jisté pˇríkazy (použití d, ❖ Restricted shell: zabránení ˇ programu˚ zadaných s cestou, použití exe ...). ˇ ˇ pˇresmerování, PATH, spouštení zmena např. omezení přístupu pouze na domovský adresář
ˇ ˇ ❖ ulimit: omezení prostˇredku˚ dostupných shellu a procesum ˚ z neho spušteným (poˇcet ˇ procesu, poˇcet otevˇrených souboru, ˚ ...). procesu, ˚ pamet’ ❖ quota: omezení diskového prostoru pro uživatele.
Shell a utlity UNIXu – p.51/66
Funkce ❖ Definice funkce: function ident () { seznam pˇ rı ´kaz˚ u } ❖ Parametry jako u skriptu: $1 ... ❖ Ukonˇcení funkce s exit- ode: return [exit- ode℄. ˇ ❖ Definice lokální promenné: typeset prom. ❖ Možnost rekurze.
Shell a utlity UNIXu – p.52/66
Správa prací – job control ˇ ❖ Job (úloha) v shellu odpovídá provádené koloneˇ procesu˚ (pipeline). ˇ kolony se vypíše [jid℄ pid, kde jid je identifikace úlohy a pid ❖ Pˇri spuštení ˇ identifikace posledního procesu v kolone. ˇ ❖ Pˇríkaz jobs vypíše aktuálneˇ provádené úlohy. ˇ ❖ Úloha muže ˚ být spuštena na popˇredí, nebo pomocí & na pozadí. ˇ ❖ Úloha bežící na popˇredí muže ˚ být pozastavena pomocí Z a pˇresunuta na pozadí ˇ pomocí fg). pomocí bg (a zpet ❖ Explicitní identifikace úlohy v rámci fg, bg, kill,...: %jid
Shell a utlity UNIXu – p.53/66
Interaktivní a log-in shell ˇ v ruzných ❖ Shell muže ˚ být spušten ˚ režimech – pro bash máme dva významné módy, které se mohou kombinovat:
• interaktivní bash (vstup/výstup z terminálu) a • log-in shell (parametr login). ˇ a ukonˇcení interpretu pˇríkazu˚ závisí na režimu v nemž ˇ ˇ Napˇr. pro ❖ Start, beh shell beží. interaktivní log-in bash platí: 1. úvodní sekvence: /etc/profile (existuje-li) a dále ~/.bash_profile, ~/.bash_login, nebo ~/.profile ~/ = domovský adresář 2. tisk $PROMPT, zadávání pˇríkazu˚ 3. exit,^D,logout – ukonˇcení interpretu s provedením ~/.bash_logout. ˇ implicitního interpretu pˇríkazu: ❖ Výber ˚
• /et /passwd • hsh – change shell
Shell a utlity UNIXu – p.54/66
Utility UNIXu
Shell a utlity UNIXu – p.55/66
❖ Utiliy UNIXu:
• užiteˇcné programy (asi 150), • souˇcást normy SUSv3, • ruzné ˚ nástroje na zpracování textu atd.
❖ Pˇrehled základních programu: ˚ awk cmp cut dd bc
jazyk pro zpracování textu, výpoˇcty atd. porovnání obsahu souboru˚ po bajtech ˇ sloupcu˚ textu výber kopie (a konverze) cˇ ásti souboru kalkulátor s neomezenou pˇresností Pokraˇcování na dalším slajdu...
Shell a utlity UNIXu – p.56/66
❖ Pˇrehled základních programu˚ – pokraˇcování... df diff du file find getopt(s) grep iconv nl od patch sed sort split tr uniq xargs
volné místo na disku rozdíl textových souboru˚ (viz i tkdiff) zabrané místo na disku informace o typu souboru hledání souboru˚ pˇredzpracování argumentu˚ skriptu˚ ˇ ˇrádku˚ textového souboru výber pˇrekódování znakových sad oˇcíslování ˇrádku˚ výpis obsahu binárního souboru oprava textu podle výstupu diff neinteraktivní editor textu ˇrazení ˇrádku˚ ˇ rozdelení souboru na menší ˇ zámena znaku˚ v souboru vynechání opakujících se ˇrádku˚ zpracování argumentu˚ (napˇr. po find) Shell a utlity UNIXu – p.57/66
Program grep ˇ ˇ ˇrádku˚ podle regulárního výrazu. ❖ Umožnuje výber ❖ Existují tˇri varianty:
• fgrep – rychlejší, ale neumí regulární výrazy
• grep – základní regulární výrazy • egrep – rozšíˇrené regulární výrazy
❖ Pˇríklady použití: fgrep -f seznam soubor grep ’^ *[A-Z]’ soubor egrep ’(Jan|Honza) +Nov´ ak’
soubor
❖ Rozšíˇrené (extended) regulární výrazy: znak
význam
+ ? {m} {m,n} (r ) |
1 − n výskytu˚ pˇredchozího podvýrazu 0 − 1 výskyt pˇredchozího podvýrazu m výskytu˚ pˇredchozího podvýrazu m − n výskytu˚ pˇredchozího podvýrazu specifikuje podvýraz, napˇr: (ab*c)* ˇ oddeluje dveˇ varianty, napˇr: (ano|ne)? Shell a utlity UNIXu – p.58/66
Manipulace textu ˇ ˇ sloupcu˚ textu. ❖ Program ut – umožnuje výber cut -d: -f1,5 /etc/passwd rozdělí podle : a vybere sloupce 1 a 5 cut -c1,5-10 soubor # znaky na pozici 1 a 5-10 ❖ Program sed:
• Neinteraktivní editor textu (streaming editor). • Kromeˇ základních editaˇcních operací umožnuje ˇ ˇ ˇ i podmínené a nepodmínené skoky (a tedy i cykly). sed ’s/nov´ ak/Nov´ ak/g’ soubor nahradí novák za Novák (/g - všechny výskyty) sed ’s/^[^:]*/-/’ /etc/passwd nahradí všechny loginy pomlčkou = tisk (tiskne řádky, na kterých najde obsah proměnné sed -e "/$xname/p" -e "/|/d" soubor_seznam -p xname ... -d = delete (smaže řádkek, pokud na něm je |) sed ’/tel:/y/0123456789/xxxxxxxxxx/’ soubor y = nahrazení znaků... nahradí všechna telefonní čísla sed -n ’3,7p’ soubor -n = netiskne implicitně řádky, tiskne pouze řádky 3 až 7 sed ’1a\ a = append tento text bude pˇ rid´ an na 2. ˇ ra ´dek’ soubor sed -n ’/start/,/stop/p’ soubor vytiskne řádky od řádku, na kterém se vyskytuje start až po řádek, na kterém je stop
Shell a utlity UNIXu – p.59/66
❖ Program awk:
• AWK je programovací jazyk vhodný pro zpracování textu, výpoˇcty atd. záznamy = řádky sloupce = sloupce :))
awk ’{s+=$1}END{print s}’ soubor_cisel pro každý řádek s+=$1, po posledním řádku vytiskne součet awk ’{if(NF>0){s+=$1;n++}} pokud je počet sloupců > 0, přičte $1, navýší počet sečtených řádků END{print n " " s/n}’ soubor_cisel vytiskne počet zpracovaných řádků a průměrnou hodnotu s awk -f awk-program soubor
❖ Program paste:
• Spojení odpovídajících ˇrádku˚ vstupních souboru. ˚ paste -d\| sloupec1.txt sloupec2.txt
vypíše se první řádek 1. souboru | první řádek 2. souboru
Shell a utlity UNIXu – p.60/66
Porovnání souboru˚ a patchování ❖ Program mp:
• Porovná dva soubory nebo jejich cˇ ásti byte po bytu. cmp soubor1 soubor2
❖ Program diff:
• Výpis rozdílu˚ textových souboru˚ (porovnává ˇrádek po ˇrádku). diff old.txt new.txt diff -C 2 old.c new.c diff -urN dir1 dir2
-C počet vypsaných předchozích řádků -r rekurzivní prohledávání -N chybějící soubory bere jako prázdné -u unifikovaný formát výstupu
❖ Program pat h:
• Zmena ˇ textu na základeˇ výstupu z programu diff. • Používá se pro správu verzí programu˚ (cvs, svn, ...). Shell a utlity UNIXu – p.61/66
Hledání soboru ❖ Program find:
• Vyhledání souboru podle zadané podmínky. find find find find find find find find
. / / / / / . .
-name ’*.c’ -type d -size +1000000c -exec ls -l {} \; -size +1000000c -execdir command {} \; -type f -size -2 -print0 | xargs -0 ls -l -type f -size -2 -exec ls -l {} + -mtime -1 -mtime +365 -exec ls -l {} \;
- hledá všechny *.c soubory - hledá všechny adresáře (zanořeně z /) - hledá všechny soubory větší než 1MB, pro každý soubor udělá ls -l {} znamená dosazení jména nalezeného adresáře \; - tady končí exec - execdir se volá tam, kde byl nalezen soubor (adresář) || - exec volá z místa spuštění find - hledá všechny soubory menší než 2, print0 odděluje slova 0(ascii), xargs zpracovává vstup a předává ho do ls -l (nespustí se 1000krát, ale 1krát s tisícem souborů), xargs rozděluje vstup do bezpečně spustitelných částí - hledá podle času modifikace (formát ve dnech) Shell a utlity UNIXu – p.62/66
ˇ Razení ❖ Program sort:
• seˇrazení ˇrádku. ˚ sort sort sort
soubor -u -n soubor_ˇ cı ´sel -t: -k3,3n /etc/passwd
-n porovnání číselně -u vyhodí duplicity -t oddělovač -k od kterého záznamu kam hledat
❖ Program uniq:
• odstranení ˇ duplicitních ˇrádku ze seˇrazeného souboru. ❖ Program omm:
• výpis unikátních/duplicitních ˇrádku˚ seˇrazených souboru. ˚ comm soubor1 soubor2 # 3 sloupce comm -1 -2 s1 s2 # jen duplicity comm -2 -3 s1 s2 # pouze v s1
předpokládá seřazené soubory
-x vyhodí sloupec
Shell a utlity UNIXu – p.63/66
Další nástroje programátora • skriptovací jazyky a interprety (perl, python, tcl, ...) • pˇrekladaˇce (cc/gcc, c++/g++, ...) • assemblery (nasm, ...) • linker ld (statické knihovny .a, dynamické knihovny .so) – dynamické knihovny používané programem: ldd, – knihovny standardneˇ v /lib a /usr/lib, – cesta k pˇrípadným dalším knihovnám: LD_LIBRARY_PATH, – run-time sledování funkcí volaných z dynamických knihoven: ltrace.
Shell a utlity UNIXu – p.64/66
• Program make: – automatizace (nejen) pˇrekladu a linkování, – pˇríklad souboru makefile (pozor na odsazení tabelátory): test: test.o tisk.o gcc $(CFLAGS) -o test test.o tisk.o test.o: test.c gcc $(CFLAGS) -c test.c tisk.o: tisk.c gcc $(CFLAGS) -c tisk.c clean: rm -f *.o test
– použití: make, make CFLAGS=-g, make lean.
Shell a utlity UNIXu – p.65/66
• automatizovaná konfigurace – GNU auto onf: – Generuje na základeˇ šablony založené na volání pˇredpripravených maker ˇ rení dostupnosti skripty pro konfiguraci pˇrekladu (urˇcení platformy, oveˇ knihoven a nástroju, ˚ nastavení cest, ...), pˇreklad a instalaci programu˚ šíˇrených ˇ ve zdrojové podobe.
– Používá se mj. spolu s automake (usnadnení ˇ tvorby makefile) a autos an ˇ tvorby šablon pro auto onf). (usnadnení – Použití vygenerovaných skriptu: ˚ ./ onfigure, make, make install • ladení: ˇ debugger napˇr. ddd postavený na gdb (pˇreklad s ladícími informacemi gcc -g ...)
• sledování volání jádra: strace • profiling: profiler napˇr. gprof (pˇreklad pomocí gcc -pg ...)
Shell a utlity UNIXu – p.66/66