Shellin historiallisesti ensimmäinen ja edelleen ensisijainen tehtävä on toimia laukaisualustana muille ohjelmille. Sen lisäksi nykyaikaiset shellit osaavat tehdä itsekin melkoisen määrän asioita, ja ovat sellaisenaankin monipuolisia ohjelmointikieliä. Silti shell-skriptit ovat suurelta osin muiden ohjelmien kutsumista ja niiden tulosten yhdistelemistä, ja olennainen osa shell-ohjelmointitaitoa onkin yleisten apuohjelmien hallitseminen.
Shell tulkitsee tiedostosta tai käyttäjältä lukemiaan komentoja normaalisti riveittäin. Interaktiivisessa käytössä välissä on komentorivin editointiin liittyviä toimintoja; niihin ei tässä puututa vaan tutkitaan mitä shell tekee saadessaan valmiin rivin käsiteltäväkseen.
Ohessa
(minish.c)
on yksinkertaisen shellin C-kielinen lähdekoodi.
Sen kääntämiseen riittää
cc -o minish minish.c
(Olettaen että cc on ANSI-C kääntäjä; esim. HP-UX:ssä
siihen tarvitaan optio -Aa.)
Minish on nimensä mukaisesti minimalistinen: Se ei ymmärrä mitään optioita, argumenttina sille voi antaa yhden tiedostonimen jolloin se lukee komentoja sieltä, muussa tapauksessa se lukee niitä stdinistä. Sen ``kieli'' on äärimmäisen yksinkertainen: se tunnistaa välilyönnit argumenttien erottimiksi, tulkitsee #:lla alkavat rivit kommenteiksi, ja tuntee yhden sisäisen komennon (exit) - ja osaa kutsua ulkoisia ohjelmia ja välittää niille parametreja.
Kaikki shellit osaavat samat asiat (jos kohta useimmat paljon muutakin), erityisesti viimeksimainittu on jokaisen shellin pääsilmukan ydin.
Moiseen minishellin tarvittava koodi on yllättävän lyhyt ja yksinkertainen, mutta se kannattanee kuitenkin käydä tarkemmin läpi:
Luettuaan komentorivin minish tekee seuraavat toimenpiteet:
Erityisesti lapsiprosessin käynnistysvaihe (fork()) on Unixille tyypillinen, ja sitä kannattaa miettiä niin että varmasti ymmärtää asian.
Tällä shellillä voidaan kirjoittaa ihan oikeita shell-skriptejä:
echo Hello, world
Jos tuo talletetaan tiedostoon hello.sh, se voidaan nyt suorittaa komennolla minish hello.sh (olettaen että minish on $PATHissa). Useimmissa Unixeissa siitä voidaan myös tehdä sellaisenaan suoritettava lisäämällä alkuun shell-määritys tyyliin #!/home/t/tt/minish ja asettamalla suoritusbitti päälle (chmod +x hello.sh), ja sitten sen voi suorittaa suoraan nimellä:
./hello.sh
Huomaa että echo on minish:lle ulkoinen komento, ja tuon skriptin toimivuus edellyttää, että se löytyy $PATHista. Näin vaikka minish ei itse $PATHista mitään ymmärräkään: se kuitenkin säilyttää sen arvon ja välittää sen edelleen execvp():lle joka osaa sitä käyttää.
Joskus on vaikea tietää mitä shell tekee ja mitä shellin kutsuma komento tekee. Tällöin voi olla hyödyllistä katsoa mitä tapahtuu kun ko. komentoa kutsutaan minish:lla. Kokeile esim. seuraavia sillä ja jollain muulla shellillä:
echo hello, world! echo "hello, world!" echo * echo \\\\ echo "\\\\" echo '\\\\' ls *
Seuraava: 4.1-4.3 Skriptien suoritustavat, funktiot, erikoismerkkien suojaus
Edellinen: 2. Shelleistä ja standardeista