Erinevus lehekülje "I/O" redaktsioonide vahel

Allikas: Kuutõrvaja
(Tavaline ehk nimeta toru (pipe))
(Sisendi ja väljundi ümbersuunamine UNIXis)
3. rida: 3. rida:
 
  Sissejuhatus
 
  Sissejuhatus
 
  Lihtsad ümbersuunamised
 
  Lihtsad ümbersuunamised
 +
Keerulised ümbersuunamised
  
  
13. rida: 14. rida:
 
Kombeks on neile kolmele viidata ka arvudega, vastavalt 0, 1, 2.
 
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:
+
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 lehitsemine (more, less)

Redaktsioon: 17. jaanuar 2007, kell 17:41

Sisendi ja väljundi ümbersuunamine UNIXis

Sissejuhatus
Lihtsad ümbersuunamised
Keerulised ümbersuunamised


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 cat 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 moodustakse uus fail. Programmi tee väljund on omakorda suunatud filtreerija grep sisendisse. Tulemusena näidatakse ekraanil vaid neid ls -la väljuni 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