Koneessani on aina kaksi kehitysversiota sillä tarkoitus on että kun toinen kuolee päivityksessä niin toisella sen saa potkaistua pystyyn - homma onkin toiminut moitteetta lukemattomia kertoja jo 6 vuotta. 
ZestyZapuksen kanssa se ei ole toistaiseksi toiminut koska koneessani on ollut vain yksi. Asensin siis toisen ZestyZapuksen mutta asentamisen jälkeen kone ei bootannutkaan siihen vaikka salasana oli oikea - mutta vieras-tilille se meni moitteetta. Asensin toisen ZestyZapuksen kymmenkunta kertaa, asensin viimeisimmän BIOS:in, tein mitälie kummallisuuksia mutta kone vaan ei bootannut.

Loppujenlopuksi pyyhin koko kovalevyn puhtaaksi ja lähdin ihan alusta. Heti alkoi boottaamaan. 
**
Olen aina ihmetellyt mistä ihmeestä Ubuntu saa vähänväliä päähänsä että muistitikku on juuren omistuksessa eivätkä muistitikut toimi. Toki siitä pääsee käskyllä:
sudo chown $USER:$USER /media/$USER
mutta onhan se inhottavaa tökkimistä ja noviiseille ylipääsemätön este. Ongelma syntyy näin:

Kun johonkin USB-porttiin laitetaan asennustikku (tai joku muu juuren omistuksessa oleva) muodostuu sille liitospiste ihan normaalisti, mutta liitospiste on juuren omistuksessa. Kun tikku irroitetaan poistuvat tikun muut tiedot mutta liitospiste ei poistu. Kun USB-porttiin sitten liitetään normaali muistitikku niin se liitetäänkin kansioon joka on juuren omistuksessa. 
- muistitikun liitospiste muodostetaan kun porttiin laitetaan muistitikku ensimmäisen kerran jonka jälkeen sen muodostama kansio ei poistu eikä sen omistaja enää vaihdu. Siis kyse on minkälaisen tikun laitat USB-porttiin ensimmäisellä kerralla. 
**
Skriptiajuri on tarkoitettu skriptien tekemiseen ja tehdyistä huolehtimiseen. Skriptiajuri on silkkaa versionhallintaa: kaikki skripti-versiot, kaikki skriptien dokumentti-versiot ja skriptien kaikki tulosteet talletetaan ja ylläpidetään niistä ristiinviittauksia.

Skriptien nimillä ei ole muotovaatimuksia vaan kaikkea voi käyttää mitä näppäimistä irti saa - pituus on rajoitettu 220 merkkiin. Skriptejä ylläpidetään koti-kansion kansiossa nimeltään OMATSKRIPTIT.


Ihminen ei täydellisesti kykene hahmottamaan suurempia kokonaisuuksia kuin esitettävälle sivulle mahtuu. Skriptauksessa tätä havaintokyvyn puutetta yritetään korjata jakamalla skriptit pää- ja aliskriteihin siinä käsityksessä että kokonaisuus on helpompi käsittää kunhan sen jokaisen osan voi esittää yhdellä sivulla. 
Skriptiajuri esittääkin valittavansa aina yhdellä sivulla.


Skriptiajuria on helpointa ajaa omalta kovalevyltä kun sille on ensin bootattu. Ajamiseen voi käyttää Skriptiajurille tehtyä käynnistintä joka on paras sijoittaa työpöydälle ja vielä parempi on ctrl-raahata se käynnistyspalkkiin. Skriptiajuria voi ajaa myös päätteessä käskyllä: . ~/OMATSKRIPTIT/Skriptiajuri. Skriptiajuria voi ajaa myös nautiluksella mistä hyvänsä. Yksi tapa on bootata live-CD:llä ja ajaa live-CD:n nautiluksella Skriptiajuria siitä koneesta johon on bootattu tai sitten toiselta USB-muistitikulta sillä live-Ubuntulla ei nykyään voi olla omaa talletustilaa. Ja skriptiajurilla taas voi ajaa MidnightCommanderia jolloin on pääsy lähes kaikkialle mikä on liitetty siihen koneeseen jolta on bootattu.

Skriptiajurin paras ominaisuus on se ettei mitään tekemistään tarvitse harkita eikä mitään tarvitse muistaa, sillä pahin seuraus paniikki-kohelluksestakin on se että äskettäin tekemänsä joutuu tekemään osittain uudelleen. Sillä teetpä mitä hyvänsä: painat ctrl-c vahingossa tai tahallasi, boottaat, potkit konettasi ympäri kämppää ... niin aloitettaessa skriptiajuri uudelleen se aloittaa siitä paikasta joka viimeksi toimi. Kannattaa kuitenkin tallettaa työnsä vähänväliä ettei joutuisi kirjoittamaan pitkää litaniaa uudelleen.
- skriptaamisen merkittävin asia on puhua kaikista asioista niin pitkillä ja kuvaavilla nimillä että ne muistaa kuolemansa jälkeenkin. BASH itse puhuu arvoituksin mutta älä sinä puhu.
- nimissä kannattaa välttää erikoismerkkejä, ääkkösia ja välilyöntejä. Kuitenkin jos selvyys vaatii niin niitä täytyy käyttää mikäli BASH:in saa ne hyväksymään; vaikeuksia ei saa vältellä.
- tietysti skriptien tekeminen on nopeampaa jos muisti pelaa eikä koskaan kohella. Mutta jos ei muista edes perusasioita ja koheltaa vähänväliä tulee työskentelystä vain hirveän hidasta mutta eteneminen on kuitenkin varmaa.

Skriptiajurin backup:ista ei tarvitse huolehtia sillä skriptiajuri kirjoittaa välittömästi kaikki muutoksensa USB-muistitikulle jos muistitikulla on kansio OMATSKRIPTIT. Muistitikun OMATSKRIPTIT kansio voi olla tyhjäkin jolloin sille kirjoitetaan koko kansio OMATSKRIPTIT.
- ominaisuuden saa toimimaan myös SSH:n yli.
- backupin tekeminen kestää skriptiajurin kannalta 2ms.
- backup tehdään jokaiselle muistitikulle joka on liitetty johonkin USB-porttiin mikäli siinä on kansio OMATSKRIPTIT. USB-porteissa voi olla muistitikku tai ei ja niillä voi olla kansio OMATSKRIPTIT tai ei. Backup toimii kaikille käyttäjille, eikä backupin toiminta ei riipu muistitikun nimestä, uuid:stä tai mistään. Tiedostomuodosta ei välitetä kunhan koneessta löytyy ajurit.
- niin pientä muistitikkua ei olekaan ettei se riittäisi, eikä sillä ole väliä minkätyypin USB se on. Siis on mahdollista käyttää monimutkaistakin backup-menetelmää usealle muistitikulle.
- muistitikulla olevasta OMATSKRIPTIT-kansiosta ei koskaan poisteta mitään vaan ainoastaan lisätään. Tällätavoin menetellen siellä on enemmän myös roskaa, mutta toisaalta sellaista vikaa ei voi tulla että jotain katoaa edes melkoisen hölmöilyn seurauksena. Muistitikulla olevan  OMATSKRIPTIT-kansion koon kasvaminen ei aiheuta ongelmia.

Skriptejä tehtäessä ei riitä, että skriptien tekeminen on helppoa ja siihen kelpaakin moni viritelmä. Mutta ongelma ei olekaan skriptien teko sinänsä, vaan se että jokainen ongelma voidaan ratkaista ziljoonalla erilaisella tavalla ja jokaisella on omat vahvuutensa ja heikkoutensa - ja tilanteeseen sopivan menetelmän valintaan tarvitaan opastusta. Tarkoitan että melkein kaikki skriptit ovat väkisin tehtyja ja huomattavasti liian isoja ja hitaita, sillä BASH:in logiikka ei sovi normaalilla tavoilla ajatteleville.    

Skriptiajuri on tehty BASH:illa sen osoittamiseksi että BASH ei ole rajoittunut pieniin skripteihin, sen nopeus ei ole riittämätön, että globaalit muuttujat olisivat yksinomaan haitta, että näkyvyys-säännöt rajoittaisivat liikaa ... Jo kauan on kaiken voinut tehdä käytettävyyden kannalta mielekkäimmällä tavalla sillä skriptiajurin toiminta-nopeus on usein jo turhankin suuri. Kun skriptiajuria käytetään skriptien tekemiseen niin koska tekemisen muut piirteet ovat hallussa jää skriptien tekemisen tehokkuus eniten riippumaan siitä kuinka tehokasta on komentorivin käyttö. Ja komentorivin käyttämisen nopeus riippuu eniten siitä kuinka osaa käyttää päätteen historiaa - mutta päätteen historiasta haku elikä käsky ctrl-r on käyttökelvoton joten skriptiajurin hakut soveltuvat hakemaan nyös poäätteen historiasta.. 
- selvitys: komentoriviä täytyy käyttää että saataisiin jokainen käskyrivi testattua yksikseen sillä rivien testaaminen valmiissa skriptissä on tosihidasta - valitettavasti niin on joskus pakko tehdä.

Monet järjestelmät kehuvat, että niiden koodi on editoitavissa niillä itsellään, mutta käytännössä niitä ei voi editoida millään tavalla. Sensijaan kehitettäessä skriptiajuriin uusia ominaisuuksia sitä editoidaan poikkeuksetta itsellään.

Skriptit ovat ohjelmia parempia ennenkaikkea järjestelmän hoitamisessa sillä ne ovat lyhyitä ja niissä BASH toimii vain mitättömän ajan sillä pääosa aikaa kuluu ulkoisissa ohjelmissa. Mutta skriptausta kannattaa käyttää myös silloin kun tulevasta ohjelmasta täytyy nopeasti saada mielikuva. Syy skriptien käyttämiseen on se, että skriptit kykenevät kaikkeen samaan kuin expertitkin ja ne toimivat nopeammin ja virheettömämmin. Mutta yksi skripti kykenee vain erittäin rajoitettuun toimintaan joten skriptejä tulee olla tuhansia jo vaatimattomassakin tehtävässä. Mutta suuresta skriptijoukosta valinta on hidasta, ja valinta jo tuhannesta skriptistä on tavanomaisin keinoin hankalaa mutta skriptiajurille tuommoiset mitättömät määrät eivät tunnu mitenkään.

vaikka yleensä onkin yhdentekevää millaisessa koneessa skripti toimii niin usein olisi mukavaa saada se helposti selville - ja joillain harvoilla skripteillä se on "pakko". Skriptiajuri hoitaa  ottaa aina selville koneen piirteitä mutta tulostaa ne sellaiseen paikkaan joka normaalisti on näkymättömissä. Nämä koneesta kertovat viestit saat esiin kun heti skriptiajuri alkaessa toimimaan pyörittää hiiren rullaa. Näyttö palaa normaaliksi heti kun teet jotakin muuta, esimerkiksi painat nuoli-näppäintä.
- skriptiajurin näyttöä voi aina selailla oltaessa pääte-tilassa. Siellä on muunmuassa kaikki ne viestit mitä skriptisi on tehnyt: enää ei tarvitse pähkäillä että mikä viesti siellä näytössä vilahti vaan voi mennä katsomaan. Näitä viestejä voi olla kymmeniä sivuja.
 
- kaiki mitä on joskus tehty löytyy arkistosta. Editoitaessa koodeja tai dokumentteja haetaan arkistosta editoriin myös muutamia viimeisimmistä versioista ja editoitaessa koodeja haetaan editoriin myös käytetyt kirjastot.
- editoitava tiedosto tarkistetaan mentäessä ajamaan skriptiä tai editoimaan skriptiä ja mikäli koodaus-virheitä löytyy mennään editointiin ja viedään lista käännösvirheestä omalle sivulle.
- vastaus jokaiseen skriptiajurin kysymykseen talletetaan historiatietoihin. Jokaiselle kysymykselle on oma historia joten tarvittava löytyy nopeasti. Historiatietoja voi selata nuolinäppäimillä niinkuin normaalistikin tai käyttää etsintää.
- hakuja on monia erilaisia; ja nimenomaan sellaisia hakuja jotka pystyvät löytämään skripteissä olevaa kapulakieltä - internetin hakukoneet eivät muuten pysty.
- kaikki ohjelmointi perustuu kopiointiin vaikkakaan sitä ei tajuta koska kirjastot ovat kopiointi-automaatteja.
- muutokset skriptiajuriin tai sen kirjastoihin tehdään yleensä skriptiajurissa itsessään. Ulkoisia ohjelmilla voi lisätä skriptiajuriin mitä vaan mutta poistamisessa on paljon ehtoja.
- mitään ei koskaan tuhota ellei erikseen pyydetä tuhoamaan. Jokainen tehty versio talletetaan arkistoon omalla numerollaan. Numero on kasvava. Editoitaessa esitetään muutama viimeinen versio.
- arkistoon voi myös mennä kokeilemaan mikä siellä olevista versioista toimii ajettuna parhaiten ja kopioida sen koodi tehtävän skriptin paikalle.
- myös näppäin-versiossa hiirellä on suuri merkitys: sillä valitaan editorissa näytettävä lehti ja hiiren rullalla saa esimerkiksi selattua päätettä; esimerkiksi aloitusviestit saa sillä näkyviin. 

Skriptiajuri kirjoittaa alussa tapahtumia botanneen levyn tiedostoon: /tmp/skriptiajuri , jotta skriptiajurin kaatuessa syytä olisi helpompi etsiä. Esimerkiksi koska kirjastoja kehitetään jatkuvasti saattaa niiden koodiin lipsahtaa virhe jolloin toiminta keskeytyy heti. tiedostosta /tmp/Skriptiajuri voi lukea syyn.
- muuten näiden tarkastelujen tulokset kirjoitetaan myös päätteeseen ja skriptiajurin käynnistyttyä näitä viestejä  voi selata hiiren rullalla. Kyseessä on siis dmesq jota ei tarvitse kutsua.

- yhtaikaa voi olla käynnissä monta skriptiajuria: yksi näyttää OHJEITA, toinen on kokoajan erikoistoiminnoissa, kolmas skriptinteossa ja neljäs dokementtia väsäämässä. Kuitenkin homma edellyttää liikaa näpräämistä jotta itsekään innostuisin - sen toimimisen olen tarkistanut jo ja käytössäkin se saattaisi olla ihan käyttökelpoinen menetelmä kun vaan viitsisi harjoitella. Mutta kunnon koneet ja 4k-näytöt muuttavat koko asetelman, sillä jokainen skriptiajuri olisi yhtaikaa näkyvissä ja niiden välillä voisi kopioida. 
**
skriptiajuri sai lisää käynnistysviestejä. Nyt niissä on muunmuassa:

Skriptiajuri käynnistyy. Tässä koneessa on BASH:in versio: 4.4.5(1)-release.  Versio 4.0 toimii jotenkin ja ylemmät versiot kunnolla
tämän skriptiajuri-version päiväys on (vvvv-kk-pp): xxxx-yy-zz

- käynnistysviestit saa näkyviin kun skriptiajurin käynnistyttyä rullaa näyttöä hiiren rullalla tai vasemman reunan hissillä. Versiopäiväyksen näkee myös painamalla nappia f3.
- foorumilla on myös kerrottu mikä on siellä olevan skriptiajurin versiopäiväys.
**
Loopit ovat sellaisia kieliä varten jotka ratkaisevat ongelmansa väkivoimin ja bash:issahan ei ole voimaa. Mutta bash on ammattilaisten tekemä ja poikkeuksetta kaikkeen löytyy keinonsa. Kunhan ei käytetä looppeja; sana: for ... kuuluu kelvottomiin skripteihin; Perlin kehittäjät ujutti loopit bashiin jotta kilpailijasta tulisi entistäkin kehnompi. 

myös matriisista voi etsiä, esimerkiksi:
koe=(kaksiyksi kaksi kolme kaksikolmatta); echo -e ${koe[@]/%/\\n} | grep -nw kaksi | grep -o ^[0-9]*
tulostaa 2 niinkuin pitääkin ja nopeus kasvaa mielettömästi. Tulos on matriisi mikäli samaa arvoa löytyy useampi. Mutta osoitteen tarkistus täytyy tehdä erikseen sillä bashin matriisien peräkkäisten osoitteiden ero voi olla mitä vaan.

Vielä kammottavampi on matriisien vertaaminen; totunnaisin keinoin hommaan sotketaan looppien lisäksi tiedostot. Mutta keinoja verrata matriiseja muistissakin on lukemattomia, esimerkiksi:
mat1=(1 2 3); mat2=(1 2 3); [[ ! $(diff <(echo $(echo -e ${mat1[@]/%/\\n})) <(echo $(echo -e ${mat2[@]/%/\\n}))) ]] && echo matriisit ovat samanlaiset || echo matriisit ovat erilaiset
mutta RAM:missa olevia muistikuvia vertaamalla päästäisiin paljon helpommalla ja toiminta olisi nopeampaa, varmempaa ... ja vielä paljon epä-totunnaisempaa:
mat1=(1 2 3); mat2=(1 2 3); apu1="$(declare -p | grep "declare.*mat1"  | cut -d= -f 2- | tr -d [])"; apu2="$(declare -p | grep "declare.*mat2"  | cut -d= -f 2- | tr -d [])"; [[ $apu1 = $apu2 ]] && echo matriisit ovat samanlaiset || echo matriisit eivät ole samanlaisia
käsky ei välitä ovatko matriisit "tavallisia" tai assositiivisia eikä paljoa matriisien koostakaan. Ja osoitteiden vastaavuus tarkistetaan myös. Ja kaikkien matriisien arvoissa sekä assosiatiivisten matriisien arvoissa että osoitteissa saa olla välilyöntejä mikäli ne ovat heittomerkkien välissä - tai osoitteissa ei kavaita heittomerkkejäkään.

Tottakai looppaaminen on välttämätöntä bash:issakin, mutta niin että bash käyttää käskyjä joissa on looppi sisällä: silloin tuo looppaaminen suoritetaan kun käsky on tulkattu C-kieliseksi. Ja joissakin käskyissä looppaaaminen on tarkoituksenakin, esimerkiksi:
seq -s* luku_josta_kertoma_lasketaan | bc
on nopein tapa laskea kertoma. Mutta siinäkään ei ole rakennetta: for ... ja looppaaminen tapahtuu C-koodisena.
 
 


 
