Erinevus lehekülje "I/O" redaktsioonide vahel

Allikas: Kuutõrvaja
 
1. rida: 1. rida:
'''Sisendi ja väljundi ümbersuunamine UNIXis'''
+
===Sisendi ja väljundi ümbersuunamine UNIXis===
  
 
  Sissejuhatus
 
  Sissejuhatus
14. 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)
20. rida: 20. rida:
 
     * programmi väljundi suunamine teise programmi sisendisse (arhiveerimine)  
 
     * programmi väljundi suunamine teise programmi sisendisse (arhiveerimine)  
  
'''Lihtsad ümbersuunamised'''
+
===Lihtsad ümbersuunamised===
  
  
'''Programmi väljundi ümbersuunamine'''
+
===Programmi väljundi ümbersuunamine===
  
Suuname kalendrit ekraanile toova käsu '''cat''' väljundi faili nimega 'aprill_2000'
+
Suuname kalendrit ekraanile toova käsu ===cat=== väljundi faili nimega 'aprill_2000'
  
 
  kalake~$ cal 4 2000 > aprill_2000
 
  kalake~$ cal 4 2000 > aprill_2000
37. rida: 37. rida:
 
  bash#~$ cal 4 2000 > /dev/tty3
 
  bash#~$ cal 4 2000 > /dev/tty3
  
'''Programmi sisendi ümbersuunamine'''
+
===Programmi sisendi ümbersuunamine===
  
 
  bash~$ nl < aprill_1998
 
  bash~$ nl < aprill_1998
 
  bash~$ wc < 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.
+
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)'''
+
===Tavaline ehk nimeta toru (pipe)===
  
 
Ühe protsessi väljundi ühendamine teise protsessi sisendiga
 
Ü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
+
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
 
  bash~$ who | wc -l
 
  3
 
  3
  
eeldusel, et käsu '''who''' väljund on selline
+
eeldusel, et käsu ===who=== väljund on selline
  
 
  priit tty0 Jun  5 12:40
 
  priit tty0 Jun  5 12:40
59. rida: 59. rida:
 
  kati  tty2 Jun  3 14: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.
+
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
+
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
 
  bash~$ more failinimi
70. rida: 70. rida:
 
  bash~$ ls -la | less
 
  bash~$ ls -la | less
  
'''Fail nimega -'''
+
===Fail nimega -===
  
 
Paljudel juhtudel saab sisendfaili nimena kasutada '-' märki. See tähendab, et programm võtab andmed oma sisendist.
 
Paljudel juhtudel saab sisendfaili nimena kasutada '-' märki. See tähendab, et programm võtab andmed oma sisendist.
76. rida: 76. rida:
 
  bash~$ who | cat fail1 - fail2  
 
  bash~$ who | cat fail1 - fail2  
  
Tulemusena kuvatakse esmalt fail1 sisu, siis '''who''' väljund ja lõpuks fail2 sisu.
+
Tulemusena kuvatakse esmalt fail1 sisu, siis ===who=== väljund ja lõpuks fail2 sisu.
  
'''Keerulised ümbersuunamised'''
+
===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.
+
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:
+
Saadame programmi ===tar=== veaväljundi seadmesse /dev/null:
  
 
  bash~$ tar seda.votit.pole.defineeritud 2> /dev/null  
 
  bash~$ tar seda.votit.pole.defineeritud 2> /dev/null  
  
Saadame programmi '''date''' väljundi seadmesse /dev/null
+
Saadame programmi ===date=== väljundi seadmesse /dev/null
  
 
  bash~$ date 1> /dev/null  
 
  bash~$ date 1> /dev/null  
96. rida: 96. rida:
 
Loomulikult ei pruugi kõiki vooge tingimata suunata /dev/null'i; võib kasutada igasuguseid protsesse ja seadmeid, mis sisendvoogudega midagi peale oskavad hakata.
 
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'''
+
===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'''.
+
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
 
  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'.
+
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'''
+
===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.
 
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.

Redaktsioon: 13. detsember 2006, kell 22:36

Sisendi ja väljundi ümbersuunamine UNIXis

Sissejuhatus
Lihtsad ümbersuunamised
Keerulised ümbersuunamised
Sissejuhatus

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 aga 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