MIni script sorozat, kezdőknek

Mini Linux script tutorial? Hogyan készítsünk scriptket a kedvenc Linux rendszerünkhöz, és mi ennek az értelme? Kaptál egy szriptet, de nem érted a működését? Minek ez neked? Kell ez egy sima, átlagos felhasználónak? Hogyan álljunk neki a scriptek írásának? Áh, minek ez, hiszen mindenre van már kész program!

A most kezdődő sorozatban ezt járjuk végig. Bár nem leszel programozó, de legalább, ha kell, egy egyszerű scripttel megoldhatod a problémádat, minimális parancssori alapismeretek mellett. Mivel ez egy hosszabb sorozat lesz, minden rész végén megtalálod a következő megjelenésének az idejét. Nem azért lesz pár nap kihagyás mert egyben nem tudnám feltenni az egészet! Érdemes átgondolni minden részben leírtakat, és begyakorolni. Nincs nagy teteje annak, hogy csak elolvasd! Ezt érdemes gyakorolni, és a témáknak az interneten is utána olvasni. Ha pedig találsz olyan megoldásokat, példákat, amiket hasznosnak találsz le is kell menteni. Az egyik ilyen jó jegyzetelő a Zim, a másik a massCode. Lényeg: a szó elszáll, az írás megmarad! Ha olvasol valamit, ami kicsit is hasznos lehet, azt mentsd le magadnak, és ha időd engedi rendszerezd. A joplin weblap mentő funkciója nekem nagyon hasznosnak bizonyult, mert egy gombnyomásra menti az éppen olvasott oldalt, és később kiszedem a hasznos példákat, infókat ezekből.

Ebben a bevezető részben jellemzően csak ismétlünk, és pár alapvető dolgot tisztázunk le.

Mi az a shell, vagy bash script?

Mini program, ami jellemzően Linux terminálban fut. A shell az a parancsértelmező környezet, ami minden Linuxon ott van, és várja a parancsaidat. Ennek a parancsértelmező környezetnek többféle megvalósítása van, ilyen a bash, a zsh stb. Ezek nagyon kicsit eltérnek egymástól, de alapvetően nincs olyan nagy különbség, hogy komoly gondot jelentsen. Én a zsh-t használom, de nagy a valószínűsége, hogy nálad (ha nem telepítettél mást) a bash az alapértelmezett.

Ha nagyon egyszerűen fogalmazok, akkor a shell script az nem más, mint egy parancsokból összeállított teendő sorozat, amit a shell értelmez és végrehajt.

Ha mini program, akkor miért nem egy komolyabb programozói nyelvet használjunk?

  • Mert nekem elegendő a shell scriptek által nyújtott, a többi programnyelvhez képest szűkebb lehetőség.
  • Mert én nem akarok programozni, csak leegyszerűsíteni a munkámat.
  • Mert én valóban arra használom, hogy „össze legózzak” pár ismert parancsot.
  • A shell scripteknek nagy előnye, hogy a más ismert Linuxos parancsokat, azok paramétereit használjuk fel, pár valóban egyszerű szerkezetben.
  • Nem akarok megtanulni, bár jó lenne, egy komolyabb programozási nyelvet, mert nem célom, hogy programozzak, csak a „legózás”.

Mikor jó a script?

  • Ha egy parancs hosszabb, mint egy sor, és párszor fel akarod használni. Ha scriptre teszed, akkor nem lesz elütés, hiszen ha egyszer jól összerakod a parancsot, és lefut rendesen, akkor más jó lesz bármikor.
  • Ha az adott feladatot sokszor el kell végezni, és nincs kedved állandóan beírogatni. Napi mentési feladat pld. jól scriptesíthető.
  • Ha nem csak egy, hanem több lépés is tartalmaz a feladat.
  • Ha olyan a megoldás, hogy ciklusokat, választási lehetőségeket kell automatizálni. Ilyen az, amikor olyan a feladat, hogy HA egy feltétel teljesül, akkor EZT, ha nem akkor AZT végezze el a program.

Mi kell a scriptek írásához?

Kettő + egy program. Az első, ami mindenképp kell egy terminál emulátor. Ez minden rendszerben ott van, bár sokféle létezik, és azt használsz, amit akarsz, én a xfce4-terminal-t használom. Mindegyik jó lesz, azt használd ami tetszik. Bár crt+alt+F1...F6 bármelyikével egy terminálba tudsz átlépni, oda be tudsz jelentkezni sokkal egyszerűbb, ha grafikus felületen nyitsz egy terminált. Én a gyorsindító sávba, és a gyorsbillentyűk közé is felvettem a kedvenc terminálomat, hogy gyorsan elérjem, ha kell.

A második egy sima szövegszerkesztő program. Itt nem kell specifikus szerkesztő, mint sok programozási nyelvhez ajánlanak. Bár a Linux guruk rögvest a vim-mel ijesztgetik szerencsétlen kezdőket, hogy csak azzal, és aki nem, az nem is igazi…, de én nem így gondolom. Jó lesz ennél egyszerűbb, és felhasználóbarátabb is. Én a geany-t használom, mert az szép, jól beállítható. A másik kedvencem a sublimetex2-es. Ez már jobban a kódszerkesztésre lett kihegyezve. Nagyon jó a nano vagy az mcedit is. Ezek egyikét alapszinten mindenképp ismerd meg! Ha nem indulna a grafikus felület, ezekkel tudsz szöveges config fájlokat szerkeszteni!

A plusz egy pedig egy normális, általad megkedvelt fájlkezelő. Én a spacefm-et használom. De bármelyik jó. Miért kell egy fájlkezelő a scriptek írásához? Mert gyorsan tudsz navigálni a fájlrendszerben vele, tudsz az adott könyvtárban terminált nyitni, és pld. a spacefm-be beleintegrálható a legtöbb script, nagyon kis átalakítással.

A shell script írásának alapvető feltétele

Ismerd a parancsokat, amiket beleírsz. Így ha látsz valamilyen minta scriptet, és a benne lévő parancsot, annak paramétereit stb. nem ismered olvass utána! Én igyekszem nagyon „semleges” példákat hozni, de soha ne másolj le valamit, amit nem értesz! A Linux parancsok a lehető legjobban dokumentált parancsok, így biztosan a „man” a „--help” és a „-h” segíteni fog. Ha pedig nem, akkor a google varázslatos ereje! Ez nem csak azért hasznos, mert nem gyilkolod le egy destruktív paranccsal a rendszeredet, hanem mert ha a leírásokat, helpeket elolvasod akkor átlátod, hogy az adott parancs mennyivel többet is tud, mint a példában látható.

Illetve én abból indulok ki, hogy ismered a saját Linux rendszeredet, ha olyan specifikus parancsot írok, ami csak Arch Linux alatt megy, akkor azt adaptálni tudod a saját Linux rendszeredre. Vagy ha esetleg nálad valami parancs nincs alapból telepítve, akkor tudod azt telepíteni.

A legfontosabb a scriptek írásánál

Fantázia! Ha látsz egy megoldást, példát, akkor azt tudd adaptálni a saját feladatodra. Nem szabad leragadni az adott példánál, hanem általános paneloknak kell tekinteni, és addig variálni vele, amíg a megfelelő nem lesz. A Linux parancsok a végtelenségig variálhatóak egymással, így csakA következő részt május 30 dátumra időzítettem. a fantáziád és a tudásod szab határt.

Eddig három programra lesz szükséged: egy szöveget szerkesztőre, ami tud normális sima txt-t menteni, egy terminál emulátorra, ami neked tetszik, vagy alapból fenn van a gépeden, és egy fájlkezelőre. Ha nem tetted volna eddig meg, akkor nézz rá a Zim-re, vagy a a massCode-ra, illetve a joplin-ra. Illetve olvasd át a belinkelt cikkeket, mert ez (és a következő eleje) csak rövid ismétlés volt!

A második részt is idemásolom: 

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 a magyarlinux.hu-n. 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.

Akit zavar a téma, vagy az, hogy egyes példákban Arch a példa, az jelezze nyugodtan a hozzászólásokban... 

Hozzászólások

kimarite képe

Születésnapra, névnapra, ünnepre.. - szövegfájl időzítve

Ha létrehozunk egy szövegfájl, akkor azt scriptként, akár Cron segítségével időzítve futtatni is tudjuk.
Annyit érdemes tudni, le is van írva a bejegyzésben:

echo parancs, utána szóköz, majd a terminál kimenetre nyomtatandó sor

És így egy verset, jókívánságot, akármit képernyőjére hozhatunk valakinek.

Egy vers

-- hozd létre a szövegfájlt (a szóköz a \ karakter segítségével használható a fájl nevében)

touch Ady\ Endre:\ Sem\ utódja,\ sem\ boldog\ őse....txt

-- tedd futtathatóvá

chmod +x Ady\ Endre\:\ Sem\ utódja\,\ sem\ boldog\ őse....txt

-- illeszd a fájlba ezt a szöveget

#!/usr/bin/env bash

echo Sem rokona, sem ismerőse
echo Nem vagyok senkinek,
echo Nem vagyok senkinek.
echo
echo Vagyok, mint minden ember: fenség,
echo Észak-fok, titok, idegenség,
echo Lidérces, messze fény,
echo Lidérces, messze fény.
echo
echo De, jaj, nem tudok így maradni,
echo Szeretném magam megmutatni,
echo Hogy látva lássanak,
echo Hogy látva lássanak.
echo
echo Ezért minden: önkínzás, ének:
echo Szeretném, hogyha szeretnének
echo S lennék valakié,
echo Lennék valakié.
echo
echo Forrás: http://magyar-irodalom.elte.hu/sulinet/igyjo/setup/portrek/ady/semutod.htm

-- mentsd el

-- futtasd a scriptet

./Ady\ Endre\:\ Sem\ utódja\,\ sem\ boldog\ őse....txt

-- kimenete

Sem rokona, sem ismerőse
Nem vagyok senkinek,
Nem vagyok senkinek.

Vagyok, mint minden ember: fenség,
Észak-fok, titok, idegenség,
Lidérces, messze fény,
Lidérces, messze fény.

De, jaj, nem tudok így maradni,
Szeretném magam megmutatni,
Hogy látva lássanak,
Hogy látva lássanak.

Ezért minden: önkínzás, ének:
Szeretném, hogyha szeretnének
S lennék valakié,
Lennék valakié.

Forrás: http://magyar-irodalom.elte.hu/sulinet/igyjo/setup/portrek/ady/semutod.htm

A Cron segítségével időzíthető (valakinek a rendszerén):
https://linuxmint.hu/blog/2020/05/cron-de-csak-roviden

Persze, úgy kell csinálni, hogy egy terminál is megnyiljon, ahol megjelenik a kimenet.

:)

Értékelés: 

0
Még nincs értékelve

csak fakultatíve: nettó árnak mennyi a bruttó értéke?

Legyen pl. Bruttoerteke.sh tartalma:

#! /usr/bin/bash
#Bruttoerteke = Nettoertek + (Nettoertek * Afakulcs / 100)
Nettoertek=$1
Afakulcs=$2
bc <<< "scale=2; $1+($1*$2/100)" 

használat: bash Bruttoerteke.sh nettó_ár  áfakulcs, pl.:

bash Bruttoerteke.sh 1000 27

(A matematikai formulában a zárójelek jelen esetben csak a jobb szemléltetés kedvéért vannak a képletekeben, amúgy szabály szerint felesleges lenne itt, de ez nem befolyásolja a működést, és elsőre jobban átlátni így)

Értékelés: 

0
Még nincs értékelve

Ha ez ilyen egyszerű

Így írtad:
 

# 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

Itt meg 1568x bonyolultabban van leírva, én eszerint csináltam, kb. 30-40 percig bénázgattam vele:
https://linuxize.com/post/create-a-linux-swap-file/

 

 

Értékelés: 

0
Még nincs értékelve