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!