I/O

Allikas: Kuutõrvaja

Sisendi ja väljundi ümbersuunamine UNIXis

Igal töötaval programmil so protsessil on:

   * sisend (ingl. k. standard input), mille kaudu sisenevad programmi andmed (sisendiks võib olla näiteks klaviatuur)
   * väljund (ingl. k. standard output), mille kaudu väljuvad programmist töödeldud andmed (nad võivad minna näiteks ekraanile)
   * veaväljund (ingl. k. standard error), mille kaudu väljuvad programmist veateated (tavaliselt lähevad nad ekraanile) 

Kombeks on neile kolmele viidata ka arvudega, vastavalt 0, 1, 2.

UNIXis saab küllaltki paindlikult töötavate programmide sisend- ja väljundvoogusid (ingl. k. input/output ehk IO) ümber suunata. Situatsioonid, kus seda on kindlasti otstarbekas kasutada:

  • programmi tekstilise väljundi lehitsemine (more, less)
  • programmi tekstilise väljundi filtreerimine (egrep, grep, sort)
  • programmi väljundi suunamine teise programmi sisendisse (arhiveerimine)

Lihtsad ümbersuunamised

Programmi väljundi ümbersuunamine

Suuname kalendrit ekraanile toova käsu cal väljundi faili nimega 'aprill_2000'

kalake~$ cal 4 2000 > aprill_2000

Suuname väljundi kettaseadmele (NB! Nii kirjutatakse alates ketta 0'ndast sektorist ilma failisüsteemita; niisiis on see vajalik ainult erijuhtudel)

kalake~$ cal 4 2000 > /dev/fd0

Suuname väljundi terminalile (selleks peab piisavalt õigusi olema)

bash#~$ cal 4 2000 > /dev/tty3

Programmi sisendi ümbersuunamine

bash~$ nl < aprill_1998
bash~$ wc < aprill_1998

Näites kasutatakse ära asjaolu, et programmid wc (sõnadelugeja) ja nl (ridadenummerdaja) loevad sisendit. On kombeks, et viisakas UNIXi programm loeb oma sisendit, kui ta käivitada ilma argumentideta.

Tavaline ehk nimeta toru (pipe)

Ühe protsessi väljundi ühendamine teise protsessi sisendiga

Näiteks käsu who väljundi suunamine käsu wc -l sisendisse annab tulemuseks hetkel süsteemi kasutavate kasutajate arvu

bash~$ who | wc -l
3

eeldusel, et käsu who väljund on selline

priit tty0 Jun  5 12:40
mart  tty1 Jun  5 10:40
kati  tty2 Jun  3 14:40

Näide illustreerib, kuidas erinevad protsessid saavad UNIXis üksteisega suhelda. Antud juhul toimub suhtlus "nimeta toru" vahendusel. Tehniliselt on nimeta toru mälubuffer, mida kasutavad kaks protsessi: üks kirjutamiseks, teine lugemiseks. Arusaadavalt peavad protsesside õigused olema sobivad, näiteks peavad nad kuuluma samale kasutajale.

Pikkade tekstifailide vaatamiseks on abiks programmid more ja less. Neid nimetatakse ka "lehitsejateks" (ingl. k. pager), sest teksti esitatakse ekraanitäite kaupa

bash~$ more failinimi

Toru abil on võimalik lehitseda ka paljusõnaliste programmide väljundit:

bash~$ ls -la | more
bash~$ ls -la | less

Fail nimega -

Paljudel juhtudel saab sisendfaili nimena kasutada '-' märki. See tähendab, et programm võtab andmed oma sisendist.

bash~$ who | cat fail1 - fail2 

Tulemusena kuvatakse esmalt fail1 sisu, siis who väljund ja lõpuks fail2 sisu.

Keerulised ümbersuunamised

Algul märkisime, et andmevoogudele võib viidata ka deskriptoritega 0, 1 ja 2. Nende kasutamine muudab ümbersuunamiste kasutamise paindlikumaks. Näiteks saab kokku liita erinevaid andmevooge.

Saadame programmi tar veaväljundi seadmesse /dev/null:

bash~$ tar seda.votit.pole.defineeritud 2> /dev/null 

Saadame programmi date väljundi seadmesse /dev/null

bash~$ date 1> /dev/null 

Mida programm ka ei väljastaks, st kas väljundit või veaväljundit, kõik suunatakse 'musta auku'.

bash~$ ls -lR / 1> /dev/null 2> &1 

Loomulikult ei pruugi kõiki vooge tingimata suunata /dev/null'i. Võib kasutada igasuguseid protsesse ja seadmeid, mis sisendvoogudega midagi peale oskavad hakata.

Andmete kõrvaletoimetamine

Eelmises punktis tõime näiteid, kuidas mitut andmevoogu üheks kokku suunata. Nüüd näitame, kuidas on võimalik ühe protsessi väljundit samaaegselt "sisse sööta" mitmele muule protsessile. Selleks on programm tee.

bash~$ ls -la | tee -a nimekiri | grep sala

Näites suunatakse käsu ls -la väljund programmi tee sisendisse, mis ühe koopia sellest suunab otse oma väljundisse ning teise salvestab faili 'nimekiri'. Võti '-a' näitab, et faili nimekiri olemasolu korral lisatakse käsu ls -la väljund selle lõppu; faili puudumisel moodustatakse uus fail. Programmi tee väljund on omakorda suunatud filtreerija grep sisendisse. Tulemusena näidatakse ekraanil vaid neid ls -la väljundi ridu, millel sisaldus järgnevus 'sala'.

Andmete lisamine faili lõppu

Kui väljundi suunamisel faili kasutada '>' asemel märki '>>', siis lisatakse uus info failis juba olemasolevale järgi. Kui fail enne puudus, siis ta luuakse.

bash~$ who >> ~/esimene_kursus/kohalolekukontroll

© EENet 2000