Shell funkció alapok – egyszerűen

Linux tipp
Shell funkció

Shell funkció alapjai. Aki ezt meghallja rögvest valami nagy és összetett eszközre gondol. Pedig egy nagyon egyszerű, alap shell ismeretekkel használható megoldás.

Mi is az a shell funkció?

Mini kis programocska, amit a shell beállító állományába szoktak elhelyezni. Azaz ez sem más, mint bármilyen kis szkript, alias, amit eddig is nagyszerűen használhattunk. Bár ez a megfogalmazás nem teljesen fedi le a shell funkció fogalmát, ebben a cikkben csak ezzel a részhalmazzal fogunk foglalkozni.

Ha van olyan feladat, ami többször előfordul, akkor érdemes azt egyszer megírni, majd felhasználni. A legtöbb ilyen shell funkció valóban a mini, kis, egyszerű jelzőkkel illethető, hiszen jellemzően nem egy összetett feladatokat ellátó megoldást rakunk bele.

Akit komolyabban érdekel a téma nagyon sok jó leírást talál hozzá. Mi most valóban az alapokat ismerjük meg, és nem az elméleti hátterét. Alapokat, azaz egy mini programocska szintjét vizsgáljuk meg.

Mi a shell funkció hátránya?

Mini kis programocska, amit a shell beállító állományába szoktak elhelyezni. A beállító állomány lehet a zsh.rc. Amit akkor olvas be a zsh, ha egy terminált indítunk, azaz ha valamit a zsh.rc-be rakunk, akkor azt bash (azaz shell váltás után) alatt nem fogjuk tudni használni. Ami nem jelent gondot, mivel sima copy, paste megoldással a legtöbb esetben villámgyorsan berakhatjuk az összes esetlegesen használt shell konfigba.

Igen, van rá mód, hogy külső fájlban tároljuk a shell funkciókat, és induláskor importáljuk be a konfigurációmba, de ez már túlmutat a mostani feladatunkon.

Alap felépítése

function name() {

list of commands

}

A formázása ettől eltérhet, de az alapfelépítése egy névből és egy parancsokat tartalmazó részből áll. A két {} közé gyakorlatilag majdnem bármilyen szkriptet, parancsok összességét, akár komolyabb szerkezettel is elhelyezhetünk.

A funkció használata nagyon egyszerű, hiszen a fenti name funkció használata annyi, hogy a terminálba beírjuk a nevét: name és ha kell a paramétereket. Pont úgy, mint egy akármilyen más program esetén. Van olyan megoldás, amikor ezeket a funkciókat egy adott programon, szkripten belül használjuk, de most nem erről lesz szó!

Ismerős a shell funkció szerkezete!

Igen, mert más használtunk ilyent, amikor a pet két alapvető funkcióját – a mentést és a visszakeresést – beírtuk a shell konfigurációs állományába. A példa jól mutatja a hasznosságát: egy gyakran felhasználandó feladatra készült egy kényelmes parancs.

Egy példa

function extract () {

if [ -f $1 ] ; then

case $1 in

*.tar.bz2) tar xjf $1;;
*.tar.gz) tar xzf $1;;
*.bz2) bunzip2 $1;;
*.rar) rar x $1;;
*.gz) gunzip $1;;
*.tar) tar xf $1;;
*.tbz2) tar xjf $1;;
*.tgz) tar xzf $1;;
*.zip) unzip $1;;
*.Z) uncompress $1;;
*) echo "'$1' cannot be extracted via extract()" ;;
esac

else
echo "'$1' is not a valid file"
fi
}

Bár összetettnek tűnik, de nagyon hasznos kiegészítése lehet a shell konfigurációdnak. Az extract után megadott tömörítvényt egy case szerkezettel megvizsgáltatjuk, hogy mi annak a kiterjesztése, majd a megfelelően paraméterezett kicsomagolónak átadjuk. Ha meg egyik kiterjesztés sem egyező, akkor azt jelzi számunkra. Rövidebb, és nem felejti el az ember a pontos szintaxist. A példa analógiájára bármilyen hasonló gyors megnyitás, kezelés, tömörítés, törlés stb. megoldható.

Egy másik példa:

function psg() {
if [ ! -z $1 ] ; then
echo "Grepping for processes matching $1..."
ps aux | grep $1
else
echo "!! Need name to grep for"
fi
}

Sok esetben kell egy futó process-t megkeresni, ami nem túl nagy feladat, ha grep-et ismered, de jobb lenne rövidebb utat is kitalálni hozzá. Ez nagyon egyszerű, ha írsz egy nem túl összetett, de megfelelő szkriptet, vagy egy shell funkció felé nézegetsz. A fenti példa is ezt mutatja. A psg és a process név beírása után lefut a ps aux | grep parancs a process névre. A többi, az echo és a if-else szerkezet csak a felhasználhatóságot segíti. Rövidebb, és nem felejti el az ember a pontos szintaxist.

Alias, szkript, shell funkció?

Parttalan, hiábavaló és felesleges a vita, hogy melyik a jobb. Az alias nagyon jó, de a lehetőségei korlátozottabbak. Ha már egy sornál hosszabb, akkor érdemes nem ezt választani. Ha összetettebb a feladat, akkor a szkript jó választás. A hátránya az elérési útban kell lenni, vagy a teljes elérési utat meg kell adni. Ez nem jelentős akadály, hiszen a PATH-ban megadott, a szkripteket tartalmazó szabvány könyvtár és alkönyvtárai témát ismerjük…

A shell funkció előnye (ezen a szinten!!!), hogy nem kell elérési út, a shell induláskor megkapja az összes infót róla. A hátrányaként említendő: nem feltétlen egyforma a bash és a zsh, vagy akár egyéb shell. Így nem feltétlen hordozható. Ami szintén nem áthidalhatatlan, de jó ha tudjuk.

Nagy hátránya a shell funkcióknak, hogy ott, ahol nem olvassa be egy program a shell konfigurációt ott nem fog működni. Azaz például a ranger-ben sem adhatjuk meg a ranger parancssorában a funkciók nevét. Ellenben, ha egy terminált nyitunk a ranger-en belül, akkor már működik, hiszen az egy terminál…

Ami egy jó dolog: a szkript és a bemutatott funkció megoldás nagyon hasonló, így átalakítható az egyik a másikra.

Mára ennyit. Ha megtetszett, és hasznosnak találtad, akkor a github-on keress rá a shell function keresőszóra, és válogass a több száz megoldás közül. Amire figyelj: ha beírsz egy funcion-t a konfigurációs fájlba, csak az újonnan indított terminálemutorban fog működni.

Related Posts