Shell scriptek – alapozás

Albert, a kereső Linux alá

Az előző részben kisebbfajta agitációt folytattam a shell scriptek kapcsán: szuper jó, gyorsítja a munkát, és egyszerűen csak összerakosgatjuk a parancsokat, amiket ismerünk, vagy megismerünk majd. Elvileg már kiválasztottad a kedvenc szövegszerkesztődet, a fájlkezelődet és a terminálemulátorodat. Ezután kialakítjuk a környezetünket, amiben gyakorolni fogunk. Én azt javaslom, hogy hozz létre egy tanuló könyvtárat, amiben majd a teszteléseket lefolytatod, és mindig ebben a könyvtárban dolgozz. Ha nekiállsz valamilyen shell scriptet írni, tesztelni vagy akármit babrálni vele ebben a könyvtárban tedd. Bár a lehető legnagyobb óvatossággal járunk el, de hibázhatunk is. A script pedig teszi a dolgát, nem azt, amit akarsz, hanem amire utasítod!

Miért fontos a shell scripteknél az óvatosság?

Miért? Mert ha kiadod az rm *.* parancsot egy scriptben, akkor az abban a könyvtárban fog mindent törölni, amiben van. Ha ez a tesztelésre szánt könyvtárad, akkor abban, ha a életed legfontosabb könyvtára, amiben a dokumentumaidat tartod, akkor abban. Így jó lenne, ha nem tüntetnél el mindent egy rossz könyvtárban elindított scripttel! Bár én igyekszem mindig úgy megírni a minta scripteket, hogy konkrétan megadom a teljes elérési utat, de ez éles környezetben nem járható út, mert a hordozhatóságot, sokszor pedig a használatot is akadályozza.
Mit jelent, hogy konkréten megadom az elérési utat? Az előbbi példa átírva rm /home/laci/Videók/*.* Ez egy törlési parancs, ami CSAK a /home/laci/Videók/ könyvtárban fog törölni, bárhol is adom ki. A te gépeden nem lesz laci felhasználó, így nem töröl semmit. Ez azért rossz, mert csak az én gépemen fut le a script, de akkor is problémás az ilyen megadás, ha újratelepítek és a felhasználói neven már Laci lesz… Pici eltérés, az emberi agynak nem is jelent gondot a laci, vagy a Laci értelemzése, de a scriptnél már problémás.
Gyakorlásnál, vagy tesztelésnél igyekezz az erre létrehozott könyvtárban működni, illetve ha ilyen konkrét elérési út van megadva, akkor nézd meg, hogy nálad is ilyen az útvonal. Bár a törlést jó eséllyel vissza tudjuk állítani, de ha pld. a shred-del végezzük el, akkor az már majdnem lehetetlen lesz. Azért beszéltem erről ennyit, hogy érezd: a scriptekkel való munka komoly tervezést is igényelhet, mert komoly hibákat is véthetsz!

A másik feladat a saját kész programjaidnak, scriptjeidnek egy könyvtárat létrehozni, és azt a PATH-ba belerakni. Erről már volt szó, így nem ismétlem meg.

Shell script formátuma

A formátuma sima szövegfájl. Ezt a szövegszerkesztődben is létrehozhatod, de a touch teszt.sh paranccsal is megteheted. A neve mindegy, de ne egyezzen meg egyetlen Linuxos paranccsal se! Illetve alias-szal se. Alapvetően tesztelés, gyakorlás közben nem fog ez gondot okozni, mert mindent az előbb létrehozott gyakorlásra szánt könyvtárban folyatunk le, de jobb a békesség!

Majd kap egy futtatási jogot chmod +x teszt.sh, de a fájlkezelődben is megadhatod neki a futtatási jogot. Figyelj rá, hogy ez megtörténjen, mert enélkül kaphatsz

zsh: engedély megtagadva: ./teszt.sh

hibaüzenetet. Majd keresheted nagy hévvel, hogy a saját könyvtáradban, az általad létrehozott, szabadon szerkeszthető programodhoz milyen engedély lett megtagadva! Jártam így, tapasztalat, hogy első pillanatban nem jut eszembe a megoláás. Bár futtatni lehet egy sima szöveges fájlt is, de ezt kerüljük. Az engedélyezési, jogosultsági rendszert nálunk okosabbak találták ki, így használjuk ezt a lehetőséget.

Ha mindenképp egy sima szövegfájlt akarsz futtatni, akkor sh teszt.sh lesz a megoldás. Jó tudni, de én ritkán használom.

A shell script felépítése

Legelső sor mindig ilyen:

#!/usr/bin/bash

Kettőskereszt, felkiáltójel és a shell pontos megadása.

Ez adja meg a pontos parancsértelmezőt, és annak a pontos helyét. Mindig ezzel kezdjünk. Bár ezek nélkül is lefut a shell script, de itt is igaz: jobb a békesség!

Az /sh, vagy a /bash az általános, mert ezek nagyon jó eséllyel minden gépen ott lesznek. Bár megadható ha indokolt pld. a #!/usr/bin/zsh is, de csak akkor ha biztosan fel lett téve a zsh shell is. Így már sejthető, hogy a #!/usr/bin/env python milyen nyelven írt programocska.

A megjegyzések, kommentek a shell scriptben

# megjegyzés

Azaz kettőskereszt, és az utána lévő dolgokat a sor végéig nem veszi figyelembe. Mindig használj sok kommentet, megjegyzést, hogy később tudd is miről van szó!

Igen az első sor is kettőskereszt, de ott a felkiáltójellel egy különleges jelentéssel bír.

A klasszikus példa: Helló Világ!

Megnyitod a szerkesztendő fájlt, ami most üres

#!/usr/bin/bash

echo Hello Világ!

#Ez egy megjegyzés ami nem fog látszani

Ha van olyan lehetőség a szövegszerkesztődben, hogy a programozási nyelvet is megadhatod, amit használsz, akkor add meg. Ezt pld bash script, shell script néven találod meg. Így egy szebb, a szintaktikát kiemelő képet kapsz. Érdemes ilyent választani, jobb a hatékonysága, ha mindent színekkel emel ki.

Majd mented.

A scriptet tartalmazó könyvtárban:

./teszt.sh

Ha mindent jót tettél, akkor kiírta a terminálba, hogy Hello Világ! Örülhetünk, az első lépést megtettük. Most kicsit variáljunk a tanulás kedvéért!

#!/usr/bin/bash

echo Hello Világ! #Ezt látjuk majd?

#Ez egy megjegyzés ami nem fog látszani

Mentés, terminálba vissza: ./teszt.sh és az eredmény? Ha jól tettél mindent az „Ezt látjuk majd?” rész sem látszik. Azaz egy parancs után is lehet egyazon sorba is megjegyzést tenni. Ha nem muszáj, akkor ne tedd! Zavaró a kód olvasásában!

Rontsuk el a scriptünket!

#!/usr/bin/bas

echo Hello Világ! #Ezt látjuk majd?

#Ez egy megjegyzés ami nem fog látszani

Az első sor utolsó betűjét töröltem le, hogy lássuk ez már hibát okoz!

./teszt.sh: bad interpreter: /usr/bin/bas: nincs ilyen fájl vagy könyvtár

Azaz érdemes szerintem egy sablont létrehozni, és azt használni. Nem marad le semmi az első sorból.

Ahogy láttátok, én azt követem, hogy a szerkesztőben mentek, nem zárom be, és azután a terminálban futtatom a parancsot. Így nem kell a szerkesztőt állandóan újranyitni, és a terminált sem zárom le. Így egy felfele nyíl nyomással az utolsó parancs előhívható. Gyorsabb a munka.

Ok, már ismerjük a felépítést, írjunk meg egy hasznosabb scriptet

Az első legyen egy swap fájl létrehozó, hiszen én swap nélkül telepítettem az Arch Linuxot.

#!/usr/bin/bash

# 5Gigás swap fálj létrehozása felcsatolása

dd if=/dev/zero of=/swapfile bs=1024 count=5242880

chmod 600 /swapfile

mkswap /swapfile

swapon /swapfile

Majd sudo ./teszt.sh és (nálam) 12 másodperc alatt kész is volt a swap fájl, felcsatolva és üzemkészen.

Ellenőrizd le:

swapon -s

Ha bármely része nem egyértelmű, akkor a linkelt cikket olvasd el. Most abban a kényelemes helyzetben vagy, hogy készen kapsz minden magyarázatot, de ha nem, akkor mindenképp nézd meg minden parancs értelmét!

Két fontos dolgot megtanultál: a legegyszerűbb script nem más, mint egy sima szövegfájl, az elején egy kötött szöveg, és felsorolod a parancsokat egymás után. Illetve itt is használni kell – ha kell – a sudo-t, ha emelt joggal kell dolgozni. A terminál automatikusan bekéri a jelszavadat, pont úgy, mintha soronként írnád be a parancsokat egyesével.

Igen, pont így jár el a shell is: soronként beolvassa és végrehajtja. Ha tudja! Ez a faék egyszerűségű script semmi hibakezelést nem tartalmaz, így érdemes figyelni menet közben.

Második shell scriptünk

A rendszer frissítés, takarítás uncsi! Adjuk a feladatot át egy scriptnek! Én Arch alapon dolgozom, a példa is erre vonatkozik. Írd át a saját rendszeredre! Ami jó gyakorlat lesz!

Több feladatot lásson el a script:

  • Frissítse az adatbázist
  • Frissítse a rendszeredet
  • Listázza ki az összes telepített csomagot, mente egy txt fájlba
  • Szedje le a felesleges „árva” függőségeket
  • Takarítson maga után a megfelelő szintig

#! /usr/bin/bash

# Adatbázis és rendszerfrissítés egy lépésben

yay -Syu --noconfirm

#Csomaglista generálása, ha valami fontosat is leszedne...

pacman -Qqe > lista.txt

# Árva csomagok törlése

pacman -Rns $(pacman -Qtdq)

# 2 verzió megtartásával törlés

paccache -rk 2

Ha nem érted mit is csináltunk, akkor a lent linkelt Arch alapozó cikkeket olvasd el. Most abban a kellemes helyzetben vagy, hogy készen kapod a magyarázatot, ha nem így lenne, akkor mindenképp nézz utána a parancsoknak! Ez is sudo! Itt is vedd észre, hogy a terminálba mindent kiírt, és ez a verzió – ahol kell – rákérdez arra, amire kell. Ezt a jelen esetben mindenképp ajánlatosnak tartom, mert ellenőrizni akartam a leszedett csomagokat.

Ahogy láthatod ez valóban legózás csak: összerakok pár parancsot EGYSZER, és lefuttatom ahányszor kell, és nincs elütés, nincs elfelejtett lépés stb. Aki egyesével tudja kezelni a fenti parancsokat, annak nem lesz gondja a scriptesítéssel sem!

Mára ennyi. A következő részt június 13-ra időzítettem. Addig gyakorolj. Írj egyszerű scripteket, olyant pld, ami létrehoz egy könyvtárat, belép, majd létrehozza a teszt.sh és ad neki futtatási jogot, majd a kedvenc szerkesztőddel meg is nyitja! Írj egy scriptet arra is, hogy a naplófájlokat lecsökkentsd egy neked megfelelő méretre, és a bash, vagy a zsh parancselőzményeit is tüntesse el.

Illetve ezeket a cikkeket olvasd át, ha még nem tetted meg!

Related Posts