Erinevus lehekülje "I/O" redaktsioonide vahel
1. rida: | 1. rida: | ||
− | + | ===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 | + | 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=== | |
− | + | ===Programmi väljundi ümbersuunamine=== | |
− | Suuname kalendrit ekraanile toova käsu | + | 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=== | |
bash~$ nl < aprill_1998 | bash~$ nl < aprill_1998 | ||
bash~$ wc < aprill_1998 | bash~$ wc < aprill_1998 | ||
− | Näites kasutatakse ära asjaolu, et programmid | + | 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 | Ühe protsessi väljundi ühendamine teise protsessi sisendiga | ||
− | Näiteks käsu | + | 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 | + | 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 | + | 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 | + | 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 -=== | |
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 | + | 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 | + | 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 | + | 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 | + | 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=== | |
− | 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 | + | 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 | + | 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. | 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
Sisukord
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