Tämä on vasta raakile ja päivitetään aikanaan:
Tietokoneen jokainen toiminto määritellään funktioilla - yksittäiset käskytkin ovat funktioita mutta yleisemmin funktio on käskyryhmä. BASH:issa voidaan määritellä uusia funktioita tai määritellä vanhoja funktioita uudestaan - vaikka määritellä sama funktio uudestaan kerran päivässä maailman tappiin asti.
BASH:issa on kymmenissä paikoissa erilaisia asioita käsitteleviä käskyjä kymmenintuhansin ja niistä useimmilla monenlaisia toimintoja kymmenittäin joten luotettavan kirjastofunktion tekeminen yksitäisistä käskyistä on BASH:issa toivottoman hidasta koska niin suuresta joukosta on hidasta valita oikeat käskyt tai edes päätellä mikä on paras tapa toimia - ja toimintatapojen nopeuserot ovat usein suuria. Tai semmoinenkin ilmiö on että tuhannesta niistä käskyistä jotka teoriassa saattaisivat skriptissäsi toimia on vain sata sellaista jotka tosiaan toimivat, niistä vain kymmenen on sellaista jotka toimivat hyvin mutta vain yksi tai kaksi sellaista jotka toimivat moitteetta.
Muissa kielissähän käyttäjät eivät yleensä saa kirjastofunktioita tehdäkään vaan kyllä se on melkolailla yksinomaan BASH:in ominaisuus.
Kunnolliset funktiot ovatkin toiminnalle välttämättömiä joten niiden soisi löytyävän aina - joten paras säilytyspaikka niille on kirjasto. BASH:in kirjastoja ei vaivaa mikään muu kuin mustamaalaus.
BASH:in kirjastoja on mustamaalattu niin kauan että täytyy kertoa kuinka niitä käytetään: kirjasto on ihan normaali tiedosto johon talletettu funktion muotoon kirjoitettuja skriptejä ja joissa BASH:in kyseessä ollen ei tarvita lausetta: #!/bin/bash eikä suorituoikeuttakaan tarvita. Kaikki tuon tiedoston funktiot saa käyttöönsä skriptiä tehdessä kirjoittamalla skriptin alkuun:
. sen_tiedosto_nimi_polkuineen_johon_funktio_on_talletettu
- siis tiedostonimen edessä on piste - sillä haluttiin antaa lyhyt nimi toiminnolle jota käytetään aina - kaikissa muissakin kielissä kirjastot esitetään alussa ja niitähän on ylensä useampiakin. Voi pisteen paikalle kirjoittaa myös sanan source - jolloin toiminta muuttuu aavistuksen verran.
- käytännössä kirjastoja pitäisi olla erityyppisille hommille omansa - ihan niinkuin muissakin kielissä.
- tai on siinä väitteessä huonosta tietoturvasta merkki perääkin sillä tietokonehan on tietoturvariski tekee sitten mitä vaan - vaikka maalaisi PC:n vihreäksi ennen mereen heittämistä.
Voit itse miettiä kirjastojen tarpeellisuutta: kun haluat tehdä jotakin niin haluatko:
1. Ilmoittaa halusi yhdellä sanalla - kirjastosta sana ja sitä vastaava toiminto löytyy varmasti ja toiminto on valmiiksi testattukin.
2. Liittää skriptiisi kymmeniä-satoja-tuhansia lauseita etsittyäsi niitä jostain huitsin nevadasta jos niitä ylipäätään löydätkään. Ja elää sitten sotkun keskellä ja pähkäillä kuinka jatkossa toimitaan sillä eivät nuo lauseet ihan semmoisenaan skriptiin sovi. Ja testata sitten aikaansaannostasi kauan ja elää sittenkin epävarmuudessa siitä että toimiiko skripti aina oikein. Ja tapellen funktion sivuvaikutusten kanssa?
Aikoinaan BASH:illa olikin käytössään kirjasto mutta silloin BASH:illa ei vielä ollutkaan kilpailijoita. Kun BASH:ille alkoi tulla kilpailijoita niin BASH:in omat virtuoosit siirtyivät välitömästi käyttämään niitä ja yrittivät tehdä tulokkaasta uuden skriptikielten kuninkaan - sillä ei käsitetty ensinäkin sitä ettei kukaan pysty tekemään merkittävämpää BASH-skriptiä järkevässä ajassa ellei hae sen kriittisiä osia kirjaston funktioista ja toiseksen että BASH:ista on mahdotonta luopua kokonaan.
Mutta jotta jostain uudesta skriptikielestä saisi skriptikielten kuninkaan täytyy vanha kuningas elikä BASH ensin tuhota.
Minkätahansa tietokone-kielen tuhoamiseksi kirjastojen kieltäminen on ylivertaisen pätevä keino - mutta kirjastot ovat BASH:inkin perusta eikä niitä voi kokonaan kieltää käyttämästä vaan ainoastaan tehdä niiden käyttämisestä hankalaa poistamalla funktioiden tiedostopolkuun viittaava kirjasto-osoitin. Mutta kun lisäksi alettiin mustamaalata BASH:in kirjastoija niin ne harvat jotka kirjastoja olivat käyttäneet eivät enää uskaltaneet kirjastoja käyttää. Ja nopeasti kehittyikin luulo ettei BASH:illa edes ole kirjastoja.
Mutta ne jotka BASH:ia edelleen kehittävät ja ylläpitävät eivät virtuoosien puheista välitä vaan he käyttävät kirjastoja ihan niinkuin ennenkin.
- esimerkiksi kun mählit skriptinteossa niin koneesi näytölle tulee usein viesti: command not found. Viestin kirjoittaa kirjastossa oleva funktio -> skriptit ovat pääte-ohjelman lapsia ja kun lapsi mählii niin pääte havaitsee sen ja kutsuu kirjastosta vikaselvitykseen funktiota nimeltä command_not_found_handle - joka sitten kirjoittaa näytölle: command not found - ellei muuta ole määrätty.
- itseasiassa on tarkoitus että skriptaaja kirjoittaan tuon: command_not_found_handle funktion uusiksi - sellaiseksi kuin senhetkisen skriptin mahdoliten vikatilanteiden selvittäminen vaatii. Mutta asia on liian monimutkainen virtuoosien käsittää ja niinpä he vain haukkuvat BASH:in vianselvitystä olemattomaksi.
- koneessasi on noin 84 muutakin tällaista myöhemmin määriteltyä kirjastofunktiota BASH:in omiin käyttötarkoituksiin - kehittäjät siis haistattavat huilua virtuooseille.
- funktioita voidaan määritellä ohjelmallisestikin mutta niin tehdään käytännössä hyvin harvoin - joskus kuitenkin: BASH voi siis opettaa itseään.
Ei BASH tuhoutunut niissä virtuoosien meingeissä mutta invalidi siitä kyllä tuli. Vaan ei niistä aikomuksista saada uusi kuningas myöskään tullut mitään.
Joten virtuooseilla oli ongelma: halusivatko he olla hyvin pieniä kaloja isossa Python-järvessä vaiko isoja vonkaleita pienessä BASH-lammessa? Moni valitsi BASH:in ja alkoi opettaa BASH:ia niiden uskottelujen kanssa joita he olivat BASH:ista aikoinaan puhuneet. Kyllä virtuoosit silti pääasiassa asiaa puhuu - mutta he kertovat vain alkeita siitä kuinka sinun tulisi toimia eivätkä ollenkaan sitä kuinka jaat tietojasi toisille ja otat tietoja toisilta. Sillä skriptaaminen ei ole yhden miehen juttu vaan kyllä se on aina ryhmätyötä - siis ei niin että skriptissäsi on jostain nyysitty idea vaan siinä täytyy olla useita nyysittyjä ideoita ja lisäksi omasikin - ja lopuksi jaat sriptisi toisillekin jotta he saisivat nyysiä siitä ideoita. Jos en olisi pakana niin sanoisin: hiellä sinun pitää leipäsi hankkiman - se ei ole rangaistus vaan ohje kuinka saat onnellisen elämän.
- totta vai tarua? Jokatapauksessa väitteissä on paljon perää niinkuin jatkossa selviää.
***
Kyllä virtuoosit siis ilmanmuuta tajusivat kirjastojen tarpeen mutta heillä oli jo toinen skriptikieli kiikarissa ja he halusivat tästä uuden skriptaamisen kuninkaaan - sillä BASH oli jo niin mennyttä ja vaikeata. Voidakseen osoittaa BASH:in olevan surkimus oli estettävä sitä kehittymästä. Helppo nakki - tehtiin uusi käskykanta joka oli kammottavan hidas. Vanhoilla käskyillä monet toiminnot ovat tuhansia? kertoja nopeampia kuin uusilla käskyillä - siis jos vanhoilla käskyillä sai aikaan millisekunnissa toimivan niin uusilla se kestäisi sekunteja. Tämä johtaa siihen että uusia käskyjä käytettäessä testauksesta tulee niin hidasta että luullaan ettei homma edes toimi.
Noiden vanhojen käskyjen kirjoitusasu on kummallinen joten ne ovat vaikeita kirjoittaa ja muistaakin. Mutta ne ovat nopeita ja ennenkaikkea kääntäjä-ystävällisiä -> kääntämisessä on käytössä sama cache-menettely kuin kaikessa muussakin. Ja cachen koolla on rajansa ja kun sinne käänetään käskyjä niin noita vanhoja ja pieniä mahtuu sinne tusinoittain mutta uusia ja suuria käskyjä vain muutama. Joten uusilla käskyillä tehdyssä skriptissä kutsutaan kääntäjää vähänväliä mutta yksinomaan vanhoista käskyistä tehdyssä vain kerran.
Mutta eivät vaikeudet kirjastokelpoisen funktion valmistumiseen tähän lopu sillä kirjastojahan kielletään käyttämästä - siis jos teet itsellesi kirjaston niin ei se muiden BASH:iin noinvain siirry.
---
Kirjasto on sama asia kuin funktiovarasto - mutta voi kirjastossa toiminnallistakin koodia olla - esimerkiksi tuloste: kirjasto sejase liitetään koodiin.
Kaikki ohjelmointikielet tarvitsevat funktioita ja ne ovatkin yksi BASH:in tukijaloista. Mutta tätä ei skriptaajille ole kerrottu - vaan päinvastoin vietiin BASH:ilta kirjasto-osoitin mikä tekee kirjastojen käyttämisen vaikeaksi ja vähentää funktioidenkin arvoa. Mutta ei tuo kirjastojen "käyttökielto" kehittäjiä koske ja niinpä koneessasikin on kirjaston alku elikä noin 85 funktiota - mutta ne helpottavat ainoastaa kehittäjien hommia ja skriptaajat hypätköön sementtiin.
BASH:in omatkin käskyt ovat tavallaan funktioita. Ja ne mitä normaalisti kutsutaan kytkimiksi ovat tavallaan funktion parametreja.
Funktio on määriteltävä ennenkuin siihen viittaa - joko se on kirjoitettava koodin alkuun tai luettava muistiin ennen skriptin ajamista.
Kun funktio on suoritettu niin palataan skriptiin funktiokutsun perään - jos funktiokutsu on ollut keskellä lausetta niin samaan lauseeseen heti kutsun perään.
Saat määritellyt funktiot näkyviin käskyllä: declare -f. Toki voit käyttääkin niitä jos tahdot: esimerkiksi anna päätteessä käsky: quote hilivinkkeli jolloin vastaksena tulee: 'hilivinkkeli'. Jos teet funktioita koneeseesi niin noiden joukkoon nekin ilmestyvät.
Kirjasto voi olla yksittäinen tiedosto jossa on monia funktioita mutta yleensä kirjasto on kansio jonka jokaisessa tiedostossa on samaa asiaa käsitteleviä funktioita.
Kirjastossa voi olla myös kutsuja kirjaston toisiin funktioihin - eteenpäin viittauksetkin sallitaan.
Kirjastofunktioista monet ovat yksinkertaisia ja niistä onkin helppo saada käsitys mistä on kyse. Esimerkiksi:
function alku () { echo 'tästä funktionteko alkaa' ;};
- tämänjälkeen jokakerran kun kirjoitat skriptiisi sanan: alku kirjoittuu tulostukseen: tästä funktionteko alkaa. Siis yksinkertaisimmassa muodossaan funktio on sama kuin alias.
Mutta jotkut kirjastofunktiot ovat pitkiä ja loogisestikin monimutkaisia - ja varsinkin BASH tarvitsee niitä - kirjastofunktioista saisi edes esimerkin siitä miten skriptit tehdään.
Kirjastojen lukumäärä ja skriptien lukumäärä niissä on viite skriptikielen käyttökelpoisuudesta. Niinpä kumpiakin tarvittaisiin tuhansittain.
***
Vakaan skriptin tekeminen ilman funktiokutsujen apua on melko hyödytön yritys. Koska annetaan ymmärtää ettei BASH:issa funktiotioita kannata käyttää niin BASH kituu - vaikka onkin täysin selvä että Pythonin harrastajat väittää näin niin pistää tosiaan ihmettelemään minkätakia BASH:in omat "virtuoosit" eivät laita näitä väittäjiä ruotuun. Funktiot helpottavat skriptitekoa suunnattomasti sillä ne tekevät pitkän toimintosarjan yhdellä käskyllä - ja usein tavalla jota et ole tullut ajatelleeksikaan ja jota yleisesti väitetään mahdottomaksi - ja joskus jopa nopeasti ja hyvin. Hyvät funktiot ovat usein työläitä kirjoittaa, mutta yleensä ne kirjoittaakin joku toinen - ja jos joudut itse kirjoittamaan funktioita niin ne kirjoitetaan vain kerran ja sijoitetaan senjälkeen kirjastoon jonka jälkeen ne ovat aina käytettävissä.
Maailmalla on valmiita ja hyvälaatuisia funktioita noin ziljoona joten voisihan niitä toimittaa alkuasennuksenkin yhteydessä - mutta niin ei tehdä sillä BASH:ista halutaan eroon mutta siihen ei toistaiseksi pystytä - mutta sitä ei missään nimessä haluta että kukaan käyttäjistä käyttäisi BASH:ia - joten sen tiestä tehdään kivikkoinen.
Varsinkin kun aloittaa skriptaamisen kannattaisi käyttää virtuoosien kirjastoja - kaikki siitä hyötyisivät, nuo virtuoosit itsekin. Sillä jos virtuoosien tekemiä funktioita ei käytetä niin käy aivan niinkuin nyt on käynyt: BASH kituu hengiltä. En tiedä kuinka yleisiä yksityiset kirjastot ovat mutta se on kyllä varmaa että niitä on.
Koska aloittelijalla ei ole kirjastoja käytettävissään niin joutuu kirjoittamaan erittäin paljon ja kokeilemaan mahdottomasti - sillä BASH:in logiikkaa ei hallitse kukaan ihan täysin vaan kaikki on kokeiltava tyyliin: onnistuiskos näin? Ja kun onnistuu niin: mitä vikaa tässä on?
Onhan niitä yksittäisiä funktioita netissäkin monessa paikassa - mutta kaikkien logiikka on hieman erilainen ja niiden yhteen sovittaminen on varsin työlästä.
Joten kun skriptinsä saa toimimaan siitä kannattaa tehdä siitä kirjastoonsa funktio jottei joutuisi samaa toimintoa kehittämään monesti uudestaan - ja uudestaan keksiessä tuska on paha sillä hukkaa aikaansa sellaiseen jonka on jo kerran tehnyt eikä tuloskaan ole silti aina hyvä.
***
Funktiot tuovat melkein aina lisää nopeutta ja niitä käyttämällä oppii paljon nopeammin tekemään vakaita skriptejä. Teoriassahan funktion käyttäminen vain hidastaa, mutta
koska funktiot ovat yleensä jonkun virtuoosin tekemiä ovat ne myös nopeita ja virheettömämpiä.
Funktiolla voi olla vain ne ominaisuudet jotka saa revittyä irti BASH:in omista käskystä - ja siitä voit olla varma että moni muu saa käskyistä irti paljon enemmän kuin sinä - tämä koskee ihan meitä kaikkia, mikään ei ole koskaan lopullista vaan jopa kaukaa historiastakin tulee yllätyksiä - useinkin muuten.
On erittäin vaikeaa tehdä BASH:iin C-kielisiä ohjelmia - mutta mahdollista se kyllä on. Sensijaan Pythonin ja Perlin käyttäminen ongelmissa on helppoa.
Ennenkuin olet koonnut itsellesi taidon tehdä omia funktioita voi käyttää virtuoosien tekemiä funktioita - tekijänoikeuksia ei kenelläkään ole joten ota irti mitä saat mutta jaa myös yhteisölle mitä itse kehität. Virtuoosien funktiot ovat yleensä nopeampia kuin mitä itse saat kasattua mutta ennenkaikkea ne eivät kompastu BASH:in omituisuuksiin.
Funktioita kuvaavat skriptit talletetaan kovalevylle - yleensä useita samaan aihepiiriin kuuluvia funktioita samaan tiedostoon. Yhdessä tiedostossa voi olla vaikka kuinkamonta funktiota. Funktion koodin voi kopioida skriptinsä alkuun tai lukea sen muistiin joko senhetkiseen pääteistuntoon tai peräti liittää päätteeseen jokakerran kun pääte avataan laittamalla funktion tai kirjaston liitoskäsky tiedostoon ~/.bashrc .
Ennen käyttämistä kaikki yhden tiedoston funktiot luetaan muistiin käskyllä joka on muotoa:
. sen_kovalevytiedoston_nimi_polkuineen_jossa_funktiot_ovat
huomioi piste alussa. Kaikki tiedostossa olevat funktiot kopioidaan muistiin jonka jälkeen funktioihin voi viitata samoin kuin niiden ollessa kirjoitettu skriptiin. Niinpä ei täydy jokakerran funktiota tarvitessaan tehdä samoille asioille uutta koodia - hölmöillen jokaisella tekokerralla hieman eritavalla.
- muuten kirjaston jokaisen skripin tulee olla käännöskelpoinen, joten kirjastoa kasattaessa on viisainta lisätä sinne funktioita yksi kerrallaan.
Koska muisti on halpaa kannattaa muistiin lukea funktioita runsaaasti - sillä vaikka niitä olisi paljonkin niin ei se toiminnan nopeuteen juuri vaikuta.
Tosin suuresta funktioiden määrästä voi seurata inhottavuuksiakin - samalla nimellä muistiin ladatuista vain viimeinen on voimassa - joten kun joku funktio ei toimi niinkuin pitäisi niin saattaa korjata väärää funktiota ja repiä hiukset päästään kun mikään ei auta. Tästä tulee muuten se hyöty että voit tehdä funktion esimerkiksi nimellä ls jolloin se korvaa BASH:in oman ls-käskyn.
BASH:in omatkin käskyt ovat funktioita - mutta ne on yleensä kirjoitettu C-kielellä ja niissä on omat sisäiset matriisinsa, looppinsa ja vaikka mitä joten jos niitä osaa hyödyntää niin saa käyttöönsä todella nopeita toimintoja. Mutta parhaat noista C-kielisistä ohjelmista on tehty tietokoneen hoitamiseen joten sellaiselle jota ei tietokoneen hoitaminen kiinnosta on BASH paljon huonompi.