rendszerprogramozás linux környezetben -...
TRANSCRIPT
Készítette: Petróczy Tibor Rendszerprogramozás Linux környezetben
1
Rendszerprogramozás Linux környezetben
1. Unix shellek és shell scriptek
Miért, és mikor:
- használtál már UNIX/Linux rendszert
- ismered a rendszer alapfilozófiáját
- nem a GUI felület az elsődleges
- hatékony és gazdaságos üzemeltetés
A shell tulajdonságai:
- parancsértelmező és programozási nyelv
- a parancsokat a standard inputról vagy állományból olvassa
- shell script segítségével egyszerűen bővíthető a parancskészlet
- paraméterezhető (kapcsolók)
- string változókra és vezérlési szerkezetekre épül
- egyszerű átirányítás (>, <)
- csővezeték használata
- beépített parancsok használhatósága
Shell részletesebb ismertetése a „Linux alapismeretek” alatt.
Shellek beállítása alapvetően az /etc/profile fájl alatt érhető el. (~/.profile, ~/.bach_profile…)
Shell script futtatása:
- shell-en keresztül -> /bin/sh fájlnév
- futtathatóvá kell tenni -> chmod 700 fájlnév, majd ./fájlnév
- sticky bit használata (más jogosultságával való futtatás)
- kezdő sor a shell elérési utja: #!/bin/sh
Futtatáskor alapvetően 2 hiba fordulhat elő, az egyik, hogy maga a script állomány nincs futtatható
állapotra állítva, a másik pedig, hogy olyan helyről szeretnénk futtatni az állomány, amely nincs
benne a PATH-ban.
Parancsok:
- Ctrl-C: program futásának megszakítása
- Ctrl-D: programból való kilépés (exit)
- Ctrl-Z: program futásának felfüggesztése (jobs, fg %n)
2
2. Shell alapelemek
Fontosabb környezeti változók:
- $HOME: login katalógus neve
- $PATH: keresési út a programok végrehajtásához
- $MAIL: elérési út ahova a mailjeink érkeznek
- $PS1: elsődleges prompt
- $PS2: másodlagos prompt
- $EDITOR: alapértelmezett szövegszerkesztő
- $PWD: aktuális munkakönyvtár
- $OSTYPE: operációs rendszer típusa
- $SHELL: jelenleg futó shell típusa
- $TERM: terminál típusa
- $RANDOM: véletlen szám
- $USER: aktuális felhasználói név
Változók használata:
- valtozo=ertek
- valtozo1=45
- valtozo2=”Test szoveg”
- értékadásnál nincs szóköz az egyenlőség bal és jobb oldalán!
- minden változót szövegként kezel
- a szöveget „…” jelek közé kell tenni
- változó kiíratása a $-jel használatával: echo $valtozo1
- ’…’ : betű szerinti kiíratás, ekkor nincs értelmezés, pl: echo ’Valtozo: $valtozo1’
- „…” : shell számára értelmes karaktereket értelmezi és behelyettesíti, pl: echo „Valtozo:
$valtozo1”
- `…` : parancsvégrehajtás, behelyettesítés
Shell belső változói:
- $# (parancssori paraméterek száma)
- $n (n-edik parancssori paraméter értéke, max. 9)
- $0 (aktuális héjprogram neve)
- $$ (futó program azonosítója)
- $? (exit státusz)
- $- (a héjprogramot végrehajtó héjnak átadott kapcsolók)
- $* (az összes paraméter egyben egyetlen stringként)
Matematikai kifejezések:
- < -lt (kisebb - less)
- <= -le (kisebb egyenlő – less equal)
- = -eq (egyenlő - equal)
- == -eq (Egyenlő - equal)
- != -ne (nem egyenlő – not equal)
- >= -ge (nagyobb egyenlő – greater equal )
3
- > -gt (nagyobb - greater)
- +, -, *, /, % (a szorzás védőkarakterrel értelmezendő: \* )
- -a logikai és ( | )
- -o logikai vagy ( & )
- ! logikai tagadás
- expr(művelet) : végrehajtás
4
3. Átirányítások
Parancs és adatfeldolgozás:
1. Szabványos bemenetre érkező adatokat fogadja (billentyűzet, file, másik program kimenete,
hardver eszköz)
2. Feldolgozás
3.a Szabványos kimenetre küldi (képernyő, file, másik program bemenete, hardver eszköz)
3.b Szabványos hibacsatorna (Hiba csatorna + egyéb információk) -> fájlba, képernyőre
Típusok:
- program > file (program kimenete fájlba, ha létezik felülírja, ha nem létrehozza)
- program >> file (program kimenete fájlba hozzáfűzéssel ha létezik, ha nem létrehozza)
- program < file (program bemenete fájlból)
- program 1 | program 2 (első program kimenete a másik program bemenete)
pl: program > /dev/audio, program > /dev/printer, program > /dev/null
Szűrők: tipikusan a stdin-ról olvasnak és a stdout-ra írnak. Egyszerűen csővezetékbe szervezhetőek.
Elágaztatás: “tee” parancs
Elágazás segítségével egyidejüleg megkapjuk a képernyőn a végeredményt + fájlba írjuk a szükséges
információkat.
pl: ps aux | sort | tee filenev
Leggyakoribb szűrők:
- cat fájlok összemásolása
- more fájlok kiírásának tördelése
- less fájlok kiírásának tördelése
- head fájl első n sora
- tail fájl utolsó n sora
- tee adatfolyam elágaztatás
- sort sorbarendezése
- tr karakterhelyettesítő
- wc sor és karakterszámláló
- diff fájl összehasonlítása
- sed adatfolyam editor
- uniq előfordulás vizsgálat
5
4. Vezérlési szerkezetek
A. Feltételkezelés (if)
if [logikai feltétel]
then
parancsok
elif [logikai feltétel]
then
parancsok
else
parancsok
fi
A feltétel kezelés során használhatjuk a “test” parancsot, vagy a *…+ zárójel part.
A “test” parancs segítségével kifejezések kiértékelése:
Fájlokra alkalmazva:
Szintaktika: test [kapcsoló] [file]
Kapcsolók
–r Értéke igaz, ha a fájl létezik és olvasható
-w írható
-x futtatható
–f Értéke igaz, ha a fájl létezik
–s Értéke igaz, ha a fájl létezik és hossza nem nulla
-b blokkos eszköz
-c karakteres eszköz
-d könyvtár
-l közvetett hivatkozás
-p csővezeték
-e létezik
-G saját csoportba tartozik
-O saját tulajdonba tartozik
file1 –nt file2 a file1 újabb, mint a file2
file1 –ot file2 a file1 régebbi, mint a file2
file1 –ef file2 afile1 és file2 azonos állományt jelöl
Karakterlánc kapcsolók:
test $str1=$str2 Értéke igaz, ha a 2 változó értéke megegyezik
test $str1 != $str2 Értéke igaz, ha a 2 string nem egyenlők
test –z $str Értéke igaz, ha a változó hossza nulla
test –n $str Értéke igaz, ha a változó hossza nem nulla
Számokra értelmezve:
Használjuk az aritmetikai összehasonlító kifejezéseket
6
B. Ciklusok (for)
A shell programozás alapvető for ciklus kezelése:
for változó in lista
do
parancsok
done
Bash script esetében használható a feltételes for ciklus kezelés:
for (( kezdőérték; feltétel; léptetés ))
do
parancsok
done
C. Ciklusok (while)
A ciklus addig fut, ameddig a logikai kifejezés értéke igaz!
while [ logikai kifejezés ]
do
parancsok
done
Figyeljük a cikluson belüli változó növelésére a feltétel függvényében, hogy ne kapjunk
végtelen ciklust, lehetséges megoldások:
valtozo=`expr $valtozo + 1`
valtozo=$((valtozo+1))
true $((valtozo++))
D. Ciklusok (until)
A ciklus addig fut, ameddig a logikai kifejezés értéke hamis!
until [ logikai kifejezés ]
do
parancsok
done
E. Többágú szelekció (case)
case valtozo in
minta1) parancs;;
minta2) parancs;;
*) parancs;;
esac
7
5. Függvények
- Függvény változói nem lokálisak, hozzáférnek a főprogram változóihoz és maguk is
létrehozhatnak újakat, ezeket a főprogram is örökölni, illetve látni fogja.
- Többszörös meghívás esetén nem lesznek többször létrehozva, csak a függvény első
meghívásakor
- önálló be- és kimenettel, visszatérési értékkel, valamint saját parancssori paraméterekkel
rendelkeznek
- visszatérésük értékét müködésük végén adják át
fuggveny ()
{
parancsok
}
fuggveny
Függvény hívásának blokkját meg kell előzni a megírt (létező) függvény törzsének.
A meghíváskor tetszőlegesen elláthatjuk a függvényünket paraméterekkel, amelyekre hivatkozhatunk a függvény törzésben.
Példa:
fuggveny_paramter ()
{
echo “Kiirjuk a 2. paramétert:“ $2
}
fuggveny_paramter “Elsö” “Második” “Harmadik” 5 “Tiz”
Jelen példában, a függvényünket 5 tetszőleges paraméterrel hívtam meg, és a függvény törzsében hivatkoztam a második meghívott paraméterre, így a képernyőre a következő sort írja ki: “Kiirjuk a 2. paramétert Második
8
6. Reguláris kifejezések
A reguláris kifejezések a UNIX/Linux rendszerek mélyebb megismerésénél nélkülözhetetlenek,
elsősorban felhasználási területük:
- keresések
- szűrések
- cserék
A szabályos, vagy reguláris kifejezésekkel vezérlhetjük a programokat.
Leggyakabban használt eszközök: grep, sed, awk
A “grep” a bemenetre érkező sorok közül csak azokat küldi a kimenetre, amelyek megfelelnek az
adott reguláris kifejezésnek (szűrési feltételnek).
A “sed” (Strem Editor) a megadott parancsok szerint módosítani is tudja a kimenetet (csere). Sor
alapú, de a teljes bemenetet egyben is kezelheti.
Az “awk” programozási nyelv szövegfeldolgozásra. Soronként kezeli a bemenetet, és a kimenetet
módosítani tudja, továbbá a sorokon belül mezőket is megkülönböztet (pozícionálás).
Használt speciális karakterek:
^ sor eleje (grep ^a file : “a” betűvel kezdődő fájlok)
$ sor vége (grep a$ file : “a” betűre végző fájlok)
. tetszőleges karakter (kivéve új sor)
\ mentesítő karakter, speciális jelentés ki/be kapcsolás
[ lista ] egyetlen karakter, amely a megadott lista bármely eleme lehet
[^lista] egyetlen karakter, amely a listában felsoroltakon kivül bármi lehet
[a-z] bármilyen kisbetű
[A-Z] bármilyen nagybetű
[0-9] bármilyen számjegy
* ismétlő karakter, a * előtt álló karakter vagy kifejezés tetszőleges (akár 0) számú előfordulása
+ ismétlő karakterek, de megköveteli, hogy az előtte lévő karakter, vagy kifejezés legalább egyszer előforduljon
( ) csoportba rendezi a szabványos kifejezéseket, egységként kezeli
| logikai VAGY
{ } illeszkedések száma ( ,x- pontosan, ,x,- legalább, {x,y} intervallum)
Példák:
cat szoveg | grep ^[0-9] - számmal kezdődik
cat szoveg | grep ^[0-9]\{1\}[^0-9] - 1db számmal kezdődik és követi valami kötelezően
cat szoveg | grep ^[0-9]\{1\}[^0-9]* - 1db számmal kezdődik, de lehet 1db szám is
9
7. Stream editor
SED: folyamat editor, vagy programozható szövegszerkesztő
A szabványos bemenetre érkező szöveget képes feldolgozni és átalakítani.
Hogyan: a feldolgozandó szöveget soronként egy átmeneti tárba, az úgynevezett mintatérbe olvassa
be, szabályos kifejezések alapján megkeres benne bizonyos részeket, majd elvégzi rajtuk az egybetűs
parancsok formájában megadott műveleteket.
pl: … | sed ’program’ vagy sed ’program’ filenév
Jelen példában a ’program’ a sed saját nyelvén írt szöveg feldolgozási utasítássorozatot jelenti.
Általános program: <cím1>, <cím2> parancs
A cím jelen esetben, lehet:
- szám: a bemenet adott sorszámú sorra
pl: sed 10 parancs - csak a 10. soron hajtódik végre
sed 1, 10 parancs - az 1-től 10-ig terjedő sorokra hajtódik végre
sed parancs 10 - a keresett mintának csak a 10. előfordulásán hajtódik végre
- szabványos kifejezés
pl: sed /[0-9]/ parancs - csak a számokat tartalmazó sorokon érvényesül
sed /[a-z]/ parancs - csak a kisbetűket tartalmazó sorokon érvényesül
Alapvető parancslista:
- p: kiíratás
- d: törlés
- s: helyettesítés egy előfordulásnál
- s-g: helyettesítés minden előfordulásnál
- a: hozzáfűzés
- i: beszúrás
- c: a mintatér cseréje
- y: a karakterek cseréje
- n: még 1 sort olvas a bemenetről és hozzáfűzi a mintatérhez
Példák:
cat szoveg | sed p - duplan jeleníti meg a sorokat
cat szoveg | sed ’10 p’ - duplán jeleníti meg a 10. sort
cat szoveg | sed ’1, 10 p’ - duplán jeleníti meg 1-10-ig a sorokat
-n - letilthatjuk az alapértelmezett megjelenítést
cat szoveg | sed –n ’10 p’ - csak a 10. sort jeleníti meg
cat szoveg | sed ’1, 10 d’ - törli 1-10-ig a sorokat
cat szoveg | sed ’s/mit/Mire/’ - csak az első előfordulást cseréljük
cat szoveg | sed ’s/mit/Mire/g’ - minden előfordulást cserélünk
cat szoveg | sed ’y/mit/Mire/’ - helyettesítendő/helyettesítő – karakterszámra egyforma!
11
8. AWK programnyelv
Jellemzői:
- Szövegfeldolgozásra szakosodott programnyelv, több változata létezik:
- awk, gawk (GNU projtect), tawk (MS-Windows DLL), awka, mksawk, awkcc, mawk…
- a C szövegszerkesztésre kihegyezett változata, képességei azonosak egy grafikus felületen
futó táblázatkezelővel
- az awk alapvető feladata, hogy olyan szövegegységeket keressen file-okban, amelyek
tartalmaznak egy bizonyos mintát
- a minta lehet szabványos kifejezés vagy logikai feltétel, ha nincs minta akkor minden sorra
végrehajtja
- az awk programok adatvezéreltek (először az adatot adjuk meg amivel dolgozni szeretnénk,
aztán azt, hogy mit szeretnénk csinálni)
Futtatása:
- szabványos bementről:
… | awk ’{parancsok}’
- feldolgozandó fájl megadásával:
awk ’{parancsok}’ file1 <file2>
- ha a program hosszabb, vagy külön fájlban van:
… | awk –f programfile
awk –f programfile file1 <file2>
programfile.awk
#!/bin/awk
Feldolgozás:
- soronként történik, a sorokat mezőkre osztja (legkisebb feldolgozási egység)
- a mezőket a mezőelválasztó karakterrel tagoljuk, értéke definiálható [-F] (alapértelmezetten:
szóköz, tabulátor)
- mezőkre hivatkozás: $1, $2,… $n, a $0 az egész sort jelöli
- a minták megadása reguláris kifejezéssel /…/ jelek között
- logikai feltételek a C-ben megszokott operátorokkal: „a>2”
Változók:
- felhasználó által megadott változók:
a. nem kell külön deklarálni, első értékadáskor létrejönnek
b. megadhatjuk program futása előtt is, vagy a héjprogram változóját is átvehetjük
pl: less /etc/passwd | awk –F: ’{nev=”Felhasznaloi nev:” ; konyvt=”Konyvtar: „ ; print nev,$1”
„konyvt$6}’
12
c. BEGIN blokk használata, ez a főciklustól független műveletek végrehajtását teszi
lehetővé, így a BEGIN még a sorok feldolgozása előtt, de csak egyszer fog végrehajtódni,
míg az END blokk a sorok feldolgozás után végez el valamilyen műveletet
pl: awk –F: ’BEGIN {nev=”Felhasznaloi nev:” ; konyvt=”Konyvtar:”} {print nev, $1”, „konyvt$6}’
- belső változók:
a. FILENAME (aktuális bemeneti fájl)
b. FS (bemeneti mezőelválasztó karakter)
c. NF (az aktuális sor mezőinek száma)
d. NR (az aktuális sor száma)
e. OFS (kimeneti mezőelválasztó karakter)
Operátorok:
- = (értékadás)
- || (vagy)
- && (és)
- ! (tagadás)
- relációs operátorok (>=, ==, !=…)
- aritmetikai operátorok (+, -, *, /, %, ++, --)
Vezérlési szerkezetek:
- ugyanaz, mint a C programozási nyelv esetében
if (feltétel) utasítás else utasítás for(kifejezés1;feltétel;kifejezés2) utasítás for(változó in tömb) utasítás while(feltétel) utasítás break continue next exit
Beépített függvények: (eltérhetnek a különböző awk-k esetében)
- cos(kif): kifejezés koszinusza - exp(kif): kifejezés exponenciális függvénye - getline(): következő sor beolvasása, ha a visszatérési értéke 0, akkor fájl vége - index(s1,s2): s2 kezdő pozíciója s1-ben - int(kif): kifejezés egészrésze - length(s): s string hossza - log(kif): kifejezés logaritmusa - sin(kif): kifejezés szinusza - split(s,a,d): s-t d elválasztójel szerint a[1]…a[n] tömbelemekre osztja, visszatérési értéke n