KOMENTOTULKIN TEHOKÄYTTÖ
© 1992-1996 Hannu Aronsson haa@iki.fi


Ymmärtämisen kautta tehokäyttöön




UNIXIN TEHOKÄYTTÖ

Shell, komentotulkki

Shelli on se ohjelma, jonka kautta käyttäjä käynnistää muita ohjelmia. Tässä mielessä se on lähellä DOSsin COMMAND.COMia. Unixin komentotulkit ovat kuitenkin paljon laajempia ja niissä on paljon käteviä ominaisuuksia.
    Shelli on vain yksi ohjelma muiden joukossa Unixissa, ei mitenkään erikoinen osa käyttöjärjestelmää, joten yleensä kukin käyttäjä voi itse valita sen komentotulkin, mitä haluaa käyttää.
    Tässä materiaalissa käytetään esimerkkinä bash -shelliä, joka on GNU-projektin /bin/sh -tyylinen komentotulkki. Linux-koneissa yleensä käytetään bashiä.
    Muita komentotulkkeja on mm. C-shell -perhe (csh, tcsh) jotka poikkeavat hieman enemmän /bin/sh -tyyppisistä shelleistä. Muita /bin/sh -perheeseen kuuluvia shellejä on mm. ksh (korn shell), zsh (Z shell), ...

Shellin toiminta

Unix-komennot ovat yleensä muotoa komento -optioita tiedostoja... . Optiot voidaan antaa eri muodoissa, yleensä ne ovat yksikirjaimisia ja niitä voi yhdistellä yhden - -merkin taakse. Joissakin ohjelmissa on kuitenkin erilainen käytäntö historiallisista syistä (tar, tail, dd).
    -a -b -ab -ba --pitkäoptio (GNU-ohjelmat, Linux) -a 100 -a100 -ba100
    Seuraavassa käydään läpi miten shell käsittelee sille annettuja komentoja.

Komennon lukeminen

Unixissa shellin tehtävä on lukea käyttäjältä (tai komentotiedostosta, shell-scriptistä) komentoja, katsoa mitä komentorivillä on kerrotty ja suorittaa haluttu komento halutulla tavalla.

Tiedostonimien laajennus

Jos käytetään tiedostonimissä villikortteja (wildcards), shelli laajentaa ne ennen komennon suorittamista listaksi tiedostojen nimiä.
    Unixin tiedostonimien wildcardit ovat perusmuodossaan * (mitä tahansa merkkejä) ? (mikä tahansa yksi merkki) [a-z] (jokin annetuista merkeistä).
    Kotihakemistoihin voidaan viitata ~tunnari muodossa. Tämä laajenee ko. käyttäjän kotihakemiston nimeksi. Kotihakemistot on mainittu /etc/passwd-tiedostossa muiden käyttäjien tietojen ohella.
    Huomaa, että unixissa piste (.) on vain merkki muiden joukossa tiedostojen nimissä (ellei tiedoston nimi ala pisteellä). Tässä Unix toimii toisin kuin DOS, joka on muutenkin paljon yksinkertaisempi tässä mielessä (* -> ????????).
    DOSissa tarvitset *.* jos haluat kaikki tiedostot (entä tiedostot ilman tarkennetta?). Unixissa * tarkoittaa kaikkia tiedostoja (paitsi pisteellä alkavia), *.* tarkoittaa tiedostoja joiden nimessä on ainakin yksi piste.

Lainausmerkit

Komentotulkissa voidaan estää tiedostonimien ja muuttujien käsittely komentorivillä "quottaamalla" haluttu teksti.
'yksinkertainen lainaus'
Estää tiedostonimien ja muuttujien laajennukset, eli teksti menee sellaisenaan komennolle.
"tavalliset lainausmerkit"
Estää tiedostonimien laajennuksen, mutta muuttujat käsitellään. Jos käytät tiedostonimiä muuttujissa, pitäisi ne aina laajentaa "$FILE" muodossa, jos tiedoston nimessä on välilyöntejä tms.
Yllämainitut lainaukset pitävät myös niiden sisällä olevan tekstin yhtenä argumenttina. Allaoleva lainaus ja tavallinen tapaus on, että syöte jaetaan sanoiksi ja joka sanasta tulee oma argumenttinsa.
`komento`
Suorittaa annetun komennon ja käyttää sen tulostaman tekstin komentorivin osana.

Syötteen ja tulostuksen uudelleenohjaus

Shellin tehtävänä on myös hallita ohjelmien syöttö- ja tulostuskanavia (standard input < , output > >> , error 2> 2>> ).
    Huomaa, että komentotulkki hoitaa tämän Unixissa, eikä komentojen itsensä tarvitse tietää mistä tiedot tulevat tai minne ne menevät.
    Yleensä komennot toimivat niin, että jos tiedoston nimiä on annettu, komento lukee tiedot ko. tiedostoista. Ellei tiedoston nimiä anneta, komento lukee tiedot standard inputista.
    Tulostus menee aina standard outputtiin, ja virheilmoitukset standard erroriin (yleensä käyttäjän pääte).

Yleensä syöte on näppäimistö ja tulostus menee päätteelle
Yleensä syöte on näppäimistö ja tulostus menee päätteelle

Tulostuksen ohjaaminen tiedostoon
Tulostuksen ohjaaminen tiedostoon

Syötteen lukeminen tiedostosta
Syötteen lukeminen tiedostosta
Usein halutaan jättää komennon tulostus tai virheet kokonaan huomiotta. Tällöin ne voidaan ohjata "laitteeseen" /dev/null joka vain syö kaiken tekstin. Haluttaessa tyhjä syöte (ei dataa), voidaan myös syöte ohjata devnullista.

Virheiden jättäminen pois
Virheiden jättäminen pois
Shell sallii myös komentojen ketjuttamisen piipuilla | ja komentojen ajamisen taustalle (eli niin, ettei odoteta komennon loppumista) & .
    Näissä tapauksissa komennot ajetaan yhtäaikaa, ja niiden stdin ja stdout kytketään sopivasti toisiinsa. Tietomäärä voi siis olla suurikin, toisin kuin esim. DOSissa, jossa piippu käyttää väliaikaistiedostoa kludgeja.

Kaksi komentoa putkessa
Kaksi komentoa putkessa
Taustalla voi ajaa helposti kauan kestäviä operaatioita, joiden tulos menee esim. tiedostoon, vaikkapa grep haa * > /tmp/haaloytyi &
    Komentoja voi myös ryhmitellä, esim. (who; date) | sort .

Job control

Komennon voi pysäyttää painamalla ^Z . Pysäytetyt ja taustalla olevat komennot näkee jobs komennolla. Komennon voi antaa jatkaa taustalla bg %N tai nostaa sen taas etualalle fg %N
    Tämä on joskus kätevää, jos on esim. editoimassa tiedostoa ja välillä haluaa ajaa jonkin toisen komennon tms.

Muita shellin ominaisuuksia

Nykyaikaisissa shelleissä on myös muita interaktiivista käyttöä helpottavia ominaisuuksia, kuten komentorivin editointi (yleensä Emacs-tyylisesti), komentohistoria, tiedostonimien laajennus (tab), yms erittäin käteviä ominaisuuksia interaktiivisessa käytössä.

Hannu Aronsson haa@iki.fi www.iki.fi/haa
© 1992-1996 Hannu Aronsson haa@iki.fi