2017. január 24., kedd

A kezdők útmutatója a shell scripteléshez: Az alapok


A Shell scriptelés gyakran kerül említésre Linux fórumokon, de sok felhasználó nem jártas benne. Ennek a könnyű és erőteljes programozási módnak a megtanulása segíthet időt spórolni, jobban megismerni a parancssort és száműzni az unalmas fájlkezelési feladatokat.

Mi az a Shell scriptelés?

A Linux felhasználóság velejárója a parancssor körüli munkálatok. Tetszik vagy sem, vannak olyan dolgok, amiket sokkal könnyebben meg lehet csinálni ezzel a felülettel, mint az egér mozgatásával és a kattintással. Minél többet használod és tanulod a parancssort, annál jobban látni fogod a lehetőségeit. Nos, a parancssor maga egy program: a shell. A legtöbb Linux disztribúció napjainkban Bash-t használ és valójában ebbe írod be a parancsokat.

Nos, néhányan közületek, akik használtak Windowst korábban, talán emlékeztek a parancsfájlokra. Ezek a kis szöveges fájlok, amiket feltölthettél parancsokkal és a Windows futtatta őket. Ez egy okos és elegáns lépés volt néhány dolog elintézésére, mint például játékok futtatására a középiskolád informatika termének gépein, amikor nem tudtál rendszermappákat megnyitni vagy parancsikonokat létrehozni. A parancsfájlok a Windowsban amíg hasznosak, egy olcsó utánzata a shell scripteknek.

 A shell scriptek lehető teszik számunkra program utasítások sorozatos megadását és végrehajtását megírt események szerint, pont mint a parancsfájlok. Lehetővé tesznek sokkal hasznosabb funkciókat, mint például a parancs helyettesítés. Meghívhatsz egy parancsot, mint például egy dátum és használhatod annak kimenetét fájl nevezési séma részeként. Automatizálhatsz biztonsági mentéseket és minden másolt fájl nevének a végére odateheted az aktuális dátumot. A scriptek nem csak parancs lehívásra használhatók. Saját jogú programok. A scriptelés lehetővé tesz számunkra programozási funkciók használatát. Például "for" ciklus használatát, ha/akkor/különben állításokat és így tovább - közvetlenül az operációs rendszered felületén belül és nem kell más nyelvet megtanulj, mivel azt használod, amit már eleve tudsz: a parancssort.

Az valóban az ereje a scriptelésnek, azt hiszem. Olyan parancsokkal programozol, amiket már eleve tudsz. mialatt megtanulod a főbb programozási nyelvek alapjait. Valami ismétlődő és unalmas kell csinálj? Scripteld! Szükséged van egy nagyon összetett parancsra gyorsan? Scripteld! Szeretnél építeni egy nagyon könnyen használható parancssoros felületet valamihez? Scripteld!    

Mielőtt belekezdesz

Mielőtt belekezdünk a scriptelős sorozatunkba, tisztázzunk némi alapvető információt. A bash shellt fogjuk használni, amit a legtöbb Linux disztribúció alapból használ. A bash elérhető Mac OS felhasználóknak is és a cygwin révén Windowson is. Mivel ennyire általános, ezért tudsz scriptelni a platformodra való tekintet nélkül. Továbbá amíg a parancsok kapcsolattal léteznek, a scriptek képesek több platformon is működni csekély utómunkával vagy anélkül.

A scriptelés könnyen használható "adminisztrátori" vagy "szuper felhasználói" előjogok használatához, így a legjobb, ha leteszteled a scripteket, mielőtt munkára fogod őket. A józan észre is szükséged van, mint például legyen azon fájlokról biztonsági mentésed, amiken a scripteket futtatni tervezed. Az is nagyon fontos, hogy a helyes funkciókat használd, például az -i az rm parancshoz, így az együttműködésed szükséges. Ez megakadályozhat némely csúnya hibázást. Mint például olvasd végig a scripteket, amiket letöltesz és legyél óvatos az adatokkal, amikkel rendelkezel, arra az esetre, ha valami balul sülne el.

Alapvetően a scripek csak sima szöveges fájlok. Bármilyen szövegszerkesztőt használhatsz írásukhoz: gedit, emacs, vim, nano... Ez a lista folytatólagos. Csak bizonyosodj meg róla, hogy sima szövegként mented el, nem rich text-ként vagy Word dokumentumként. Mivel szeretem a nano nyújtotta könnyű kezelhetőséget, én azt fogom használni.

Script jogosultságok és nevek

A scriptek végrehajtása a programokhoz hasonlóan történik és ahhoz, hogy ez megtörténjen, a megfelelő jogosultságokra van szükségük. Végrehajthatóvá tudsz tenni egy scriptet az alábbi parancs futtatásával:

chmod +x ~/somecrazyfolder/script1

Ez lehetővé teszi mindenki számára annak az egyéni scriptnek a futtatását. Ha korlátozni szeretnéd a használhatóságát csak a saját felhasználód számára, használd az alábbi parancsot:

chmod u+x ~/somecrazyfolder/script1

Ahhoz, hogy futtasd ezt a scriptet át kell váltanod a megfelelő könyvtárba és utána futtatni a scriptet így:

cd ~/somecrazyfolder
./script1

Hogy még kényelmesebbé tedd a dolgokat, elhelyezheted a scripteket egy "bin" mappában a home könyvtáradban:

~/bin

Sok modern disztribúcióban ez a mappa már nincs alapból létrehozva, de létrehozhatod. Ez általában az a hely, ahol a felhasználói fiókodhoz tartozó végrehajtható fájlok tárolódnak és nem más felhasználókhoz. A scriptek ide helyezésével a nevük beírásával is indíthatod őket, mint a többi parancsot, anélkül, hogy a cd-vel ide kellene lépj és használnod kéne a './' előtagot.

Mivel elnevezed a scriptet, az alábbi parancsot kellene használd, hogy megnézd, van-e olyan telepített programot, ami ugyanezt a nevet használja:

which [parancs]

Sok felhasználó a korai scriptjeit úgy "test"-ként nevezi el és amikor futtatni próbálják a parancssorban, nem történik semmi. Ez azért van, mert ütközik a test paranccsal, ami paraméterek nélkül nem csinál semmit. Mindig bizonyosodj meg róla, hogy a script neved nem ütközik parancsokkal, mert egyébként olyan dolgok végzésében találhatod magad, amiket egyébként nem szándékoztál csinálni.

Scriptelési irányelvek  


Ahogy korábban említettem, minden script alapvetően sima szöveg. Ez persze nem azt jelenti, hogy bármit olyasmit beleírhatunk, amit kényünk-kedvünk szerint gondolunk. Amikor a szöveges fájlt megpróbálják feldolgozni, a shellek végigelemzik olyan nyomok után, hogy scriptek vagy sem és hogyan kezeljenek mindent megfelelően. Ezért van néhány irányelv, amit tudnod kell:

  1. Minden scriptnek "#!/bin/bash"-al kell kezdődnie.
  2. Minden új sor egy új parancs.
  3. A magyarázó (comment) soroknak #-el kell kezdődnie.
  4. A parancsok ()-lel vannak körbevéve.  

A Hash-durrantós Hack

Amikor a shell végigelemez egy szöveges fájlt, a legközvetlenebb út a fájlod scriptként való azonosításához az első sorod elkészítése:

#!/bin/bash

Ha másik shellt használsz, helyettesítsd annak elérési útvonalával. A magyarázó sorok kettős kereszttel (#) kezdődnek. de a felkiáltójel (!) és a shell útvonal hozzáadása egyfajta hack, ami megkerüli ezt a magyarázó szabályt és a script végrehajtására készteti a shellt, amire ez a sor mutat.

Új sor = Új parancs

Minden új sort új parancsnak kell tekinteni vagy egy nagyobb rendszer részének. A ha/akkor/különben állítások például több sort vesznek igénybe, de minden része annak a rendszer egy új sorban van. Ne engedd, hogy egy parancs beleérjen a következő sorba, mivel ez belerondíthat az előző parancsba és hibád adhat a következő sorban. Ha a szövegszerkesztőd csinálja, ki kellene kapcsolnod a szöveg tördelését, hogy a biztonságos oldalon maradj. A nano-ban az ALT+L gombokkal tudod kikapcsolni a szöveg tördelését.

Magyarázz gyakran #s-sel

Ha #-tel indítasz egy sort, akkor az figyelmen kívül lesz hagyva. Ez egy magyarázó sorrá változik, ahol emlékeztetheted magad, hogy mi volt az előző parancs kimenetele vagy mit csinál a következő parancs. Mégegyszer, kapcsold ki a szöveg tördelését vagy a magyarázatodat tedd több olyan sorba, ami kettős kereszttel kezdődik. Sok magyarázat használata egy jó rendszeres gyakorlat, mert segít neked és más embereknek a scripteted könnyebben finomhangolni. Az egyetlen kivétel ez alól a fent említett Hash-durrantós hack, így ne kövesd az #s-t !s-sel. ;-)

A parancsok zárójelekkel vannak körbevéve

Régebben a parancsok behelyettesítése egyetlen vonással történt (', osztozik a ~ gombbal).    
Ezt nem fogjuk érinteni, de amikor az emberek többsége kikapcsolódik az alapok megtanulása után és körülnéz, valószínűleg jó ötlet megemlíteni, hogy zárójeleket kellene használnod inkább. Ez főleg azért van, mert amikor beágyazol - parancsokat teszel más parancsok közé - a zárójelek jobban működnek.

Az első scripted

Kezdjük egy sima scripttel, ami lehetővé teszi számodra fájlok másolását és dátumok hozzáfűzését a fájlnév végéhez. Hívjuk "datecp"-nek. Először nézzük meg, hogy ez a név ütközik-e valamivel:


Láthatod, hogy nincs kimenet a which parancsra, így készen állunk ezen név használatára.

Hozzunk létre egy üres fájlt a ~/bin mappában:

touch ~/bin/datecp


Most pedig változtassuk meg a jogosultságokat, mielőtt elfelejtjük:


Kezdjük meg hát a scriptünk felépítését. Nyisd meg a fájlt a választott szövegszerkesztőddel. Mint mondtam, én a nano egyszerűségét kedvelem.

nano ~/bin/datecp

Menjünk és illesszük be a nélkülözhetetlen első sort és egy magyarázatot arról, hogy mit csinál ez a script. 


Következőnek adjunk meg egy változót. Ha tanultál valaha algebrát, valószínűleg tudod mi az.
Egy változó lehetővé teszi számunkra információ tárolását és az azzal kapcsolatos dolgok végrehajtását. A változók "kibővülhetnek", ha máshol kerülnek említésre. Azaz a nevük kijelzése helyett a tárolt tartalmuk kerül kijelzésre. Később megadhatod ugyanannak a változónak, hogy tároljon más információt és bármilyen instrukciót, ami az új információ használatával kapcsolatban történik. Ez egy ötletes helykitöltő.

Mit fogunk beletenni a változónkba? Nos, tároljuk a dátumot és az időt! Hogy ezt megtegyük, meghívjuk a date parancsot.

Nézd meg az alább látható képernyőképet, hogy lásdt, hogyan épül fel a date parancs kimenete:
   
 Láthatod, hogy különböző változók hozzáadásával, amik %-kal kezdődnek, módosíthatod a parancs kimenetét olyanra, amilyenre szeretnéd. Több információért ezzel kapcsolatban lásd a date parancs használati utasításának oldalát.

Használjuk a date parancs utolsó megközelítését, "data +%m_%d_%y-%H.%M.%S" és használjuk azt a scriptünkben.



Ha most azonnal mentenénk a scriptet, tudnánk futtatni és a date parancs kimenetét adná, ahogy azt várnánk:



De csináljunk valami mást. Adjunk meg egy változó nevet, mint például date_formatted ehhez a parancshoz. A megfelelő szintaxis ehhez az alábbi:

variable=$(parancs –opciók paraméterek)

Mi ezt így szeretnénk felépíteni:


  Ezt hívjuk parancs behelyettesítésnek. Lényegében megmondjuk a bashnak, hogy bármikor, amikor "date_formatted" változó felbukkan, futtassa a zárójeleken belüli parancsot. Aztán bármilyen kimenetet is adnak a parancsok, kerüljön kijelzésre a változó neve, "date_formatted" helyett.

Itt van egy példa script és a kimenete:





Figyeld meg, hogy két szóköz van a kimenetben. Egy az echo parancsnál az idézőjelek között és a változó előtti szóköz is megjelenítésre kerül. Ne használj szóközöket, ha nem akarod, hogy felbukkanjanak. Azt is vedd tudomásul, hogy a hozzáadott "echo" sor nélkül a script abszolút semmilyen kimenetet nem adna. 

Térjünk vissza a scriptünkhöz. Következőnek adjuk hozzá a parancs másolás részét.

cp –iv $1 $2.$date_formatted

     
Ez meghívja a copy parancsot az -i és a -v opciókkal. Az előbbi megerősítést kér, mielőtt felülír egy fájlt és az utóbbi megjeleníti azt, ami a parancssorban van. 

Folytatásként láthatod, hogy hozzáadtam az "$1" opciót. A scriptelésnél a dollár jel ($), amit egy szám követ, a script számozott paraméreteit jelzi, amikor az meghívásra került.

Például az alábbi parancsban:

cp –iv Trogdor2.mp3 ringtone.mp3

Az első paraméter a "Trogdor2.mp3" és a második paraméter a "ringtone.mp3".

Visszatérve a scriptünkhöz, láthatjuk, hogy két paraméterre hivatkozunk:


Ez azt jelenti, hogy amikor futtatjuk a scriptet, két paramétert kell biztosítanunk a script számára, hogy az megfelelően fusson. Az első paraméter, $1, a fájl, amit másolni fogunk és ez "cp -iv" parancs első paramétereként van behelyettesítve.

A második paraméter, $2, a kimeneti fájlként funkciónál ugyanazon parancs számára. De láthatod azt is, hogy különbözik. Hozzáadtunk egy pontot és meghívtuk a "date_formatted" változót fentről. Kíváncsi vagy, hogy ez mit csinál?

Itt van, hogy mi történik akkor, ha a script fut:


Láthatod, hogy a kimeneti fájl úgy néz ki, ahogy megadtam az $2-nél, folytatva egy ponttal és a date parancs kimenetével! Van értelme, ugye?

Most már ha futtatom a datecp parancsot, ez a script fog futni és lehetővé teszi számomra bármilyen fájl másolását egy új helyre és automatikusan hozzáadja a dátumot és az időt a fájlnév végéhez. Hasznos dolgok archiválásához!

A shell scriptelés az operációs rendszered munkára fogásának a középpontjában van. Új programozási nyelvet se kell, hogy tanulj. Próbálj meg scriptelni némely alapvető parancsokkal otthon és kezd el gondolkodni, hogy mire tudnád ezt használni.

Scriptelsz? Van bármilyen ötleted kezdők számára? Oszd meg gondolataidat a hozzászólásokban! Ez a sorozat folytatódni fog.

Felhasznált forrás: The Beginner's Guide to Shell Scripting: The Basics

Nincsenek megjegyzések:

Megjegyzés küldése