Kun kirjoitat komentoja, voit yleensä sanoa, toimivatko ne vai eivät. Komennot, jotka eivät voi toteuttaa pyyntöäsi, tulostavat yleensä virheviestin. Tämä riittää, jos kirjoitat jokaisen komennon käsin ja katsot ulostuloa, mutta joskus (jos vaikkapa kirjoitat skriptiä) tahdot komentojesi reagoivan eri tavalla, kun komento epäonnistuu.
Tämän mahdollistamiseksi komento palauttaa lopputilan. Lopputilaa ei normaalisti näytetä, sen sijaan se sijoitetaan muuttujaan (nimettyyn muistipaikkaan), jonka nimi on "$?". Lopputila on numero väliltä 0 ja 255; nolla merkitsee onnistumista, mikä tahansa muu arvo merkitsee epäonnistumista.
Yksi tapa nähdä lopputila on käyttää komentoa "echo"
sen näyttämiseen:
$ echo "tämä toimii hyvin" tämä toimii hyvin $ echo $? 0 $ hhhhhh bash: hhhhhh: command not found $ echo $? 127
Katsotaanpa virheidenhallinnan eri tapoja.
Virheen hallinta on tapa tehdä jotain ehdollisesti: jos (if) jotain tapahtuu, silloin (then) tahdot tehdä toimenpiteitä. Komentotulkki tarjoaa yhdistelmäkomennon - muita komentoja ajavan komennon - jota kutsutaan nimellä "if"
. Perusmuoto on:
if <komento> then <komennot-jos-onnistuu> fi
Aloitamme perusesimerkillä, jonka jälkeen parantelemme sitä tehdäksemme siitä käyttökelpoisemman. Kun olemme kirjoittaneet "if"
ja painaneet näppäintä Enter, komentotulkki tietää, että olemme yhdistelmäkomennon keskellä, joten se näyttää erilaisen komentokehotteen (>) muistuttamaan meitä siitä.
$ if > man ls > then > echo "Nyt tiedät enemmän komennosta ls" > fi Komennon ls manuaalisivu vierii ohi... Nyt tiedät enemmän komennosta ls
Tämän komennon ajaminen tuo esille komennon "ls"
opassivun. Näppäimistöllä "q" poistuttaessa "man"
-komento poistuu onnistuneesti ja komento "echo"
suoritetaan.
Komentoon voidaan lisätä "else"
(muuten) tarkentamaan, mitä komennon epäonnistuessa pitää tehdä:
if <komento> then <komento-jos-onnistuu> else <komento-joka-epäonnistuu> fi
Ajetaanpa komento "apropos"
, jos komento "man"
epäonnistuu.
$ if > man draw > then > echo "Nyt tiedät enemmän komennosta draw" > else > apropos draw > fi ... lista komennon apropos draw tuloksista ...
Tällä kertaa "man"
-komento epäonnistui, koska komentoa "draw"
ei ole olemassa, ja se aktivoi komennon "else".
Rakenne "if-then" on erittäin käyttökelpoinen, mutta melko monisanainen riippuvien komentojen yhdistämiseen. Operaattorit "&&" (ja) ja "||" (tai) tarjoavat vähemmän tilaa vievän vaihtoehdon.
komento1 && komento2 [&& komento3]...
Operaattori "&&" yhdistää kaksi komentoa yhteen. Toinen komento toimii vain, mikäli ensimmäisen poistumistila on nolla, eli komennon onnistuttua. Useampaa kappaletta operaattoria "&&" voidaan käyttää samalla rivillä.
$ mkdir mylogs && cd mylogs && touch mail.log && chmod 0660 mail.log
Tässä on esimerkki useammista komennoista, joista jokainen olettaa edellisen komennon toimineen onnistuneesti. Jos olisimme käyttäneet tämän tekemiseen rakennetta "if"-then, olisimme ehkä päätyneet näpertelemään suurella joukolla "if" ja "then" -komentoja.
Huomaa, että operaattori "&&" menee oikosulkuun, eli yhden komennon epäonnistuessa sen jälkeen tulevia komentoja ei ajeta. Käytämme tätä ominaisuutta hyväksemme estääksemme epätoivotut vaikutukset (kuten tiedoston "mail.log" luominen väärään hakemistoon edellisessä esimerkissä).
Jos "&&" vastaa komentoa "then"
, operaattori "||" vastaa komentoa "else"
. Se tarjoaa mekanismin sen määrittelyyn, mikä komento suoritetaan, mikäli ensimmäinen komento epäonnistuu.
komento1 || komento2 || komento3 || ...
Jokainen komento ketjussa toimii vain, mikäli edellinen komento ei onnistunut (sen poistumistila oli jotain muuta kuin nolla).
$ cd Työpöytä || mkdir Työpöytä || echo "Työpöytähakemistoa ei löytynyt ja sitä ei voitu luoda"
Tässä esimerkissä yritämme mennä hakemistoon "Työpöytä", jonka epäonnistuttua luomme sen, ja jos luominen epäonnistuu, tiedotamme asiasta käyttäjälle virheviestillä.
Tällä tiedolla voimme luoda tehokkaan ja tiiviin "helpme"
-funktion. Edellisissä esimerkeissämme olemme näyttäneet kaksi eristyksissä käytettyä operaattoria, mutta ne voidaan myös sekoittaa keskenään.
$ function helpme() { man $1 && echo "nyt tiedät enemmän aiheesta $1" || apropos $1 }
Kuten varmaan huomasit, "echo "nyt tiedät enemmän..."" ei ole kauhean hyödyllinen komento. (Se ei välttämättä ole edes kovin paikkansapitävä, sillä ehkä komento "man
" esitteli niin paljon erilaisia valitsimia, että käyttäjä meni vain sekaisin). Nyt yksinkertaistamme funktion muotoon:
$ function helpme() { man $1 || apropos $1 }
Toivottavasti poistut tästä luvusta nollan poistumistilalla!
There has been error in communication with Booktype server. Not sure right now where is the problem.
You should refresh this page.