teejuht
1. | Sissejuhatus |
2. | I/O suunamine kasutamata deskriptoreid 0, 1, 2 |
3. | I/O suunamine kasutades deskriptoreid 0, 1, 2 |
4. | Kokkuvõttev tabel |
Kui veidi järele mõelda siis on tõesti ehk õige väita, et programmil on
- sisend kust sisenevad programmi andmed (tavaliselt saab programm sisendi
klaviatuurilt ehk standard inputist, arv 0)
- väljund mille kaudu väljuvad programmist töödeldud
andmed (tavaliselt lähevad nad monitorile ehk standard output'i,
arv 1)
- veaväljund mille kaudu väljuvad programmist veateated (tavaliselt
monitorile, mida nimetatakse sel puhul standard error'iks, arv 2)
Linux's saab küllaltki paindlikult prgrammide nn. mulkudesse ja mulkudest tulevaid andmevooge edasi ja ümber suunata. Enamasti on need ümbersuunamised mingi filtreerimise moodi moega aga mitte ainult.
2. I/O suunamine kasutamata
deskriptoreid 0, 1, 2
>
programmi väljundi ümersuunamine |
Suuname kalendri ekraanile
toova käsu väljundi faili.
bash# cal 4 1998 > aprill_1998 (tehes ls ja cat aprill_1998 võib veenduda, et asi toimis) suuname väljundi floppy'
kettaseadmele
suuname väljundi kellegi
teise terminalile
|
|||||||||
<
programmi sisendi ümbersuunamine |
bash# cat < aprill_1998
bash# wc < aprill_1998 tõsi paljud programmid
on arvestatud nii, et nende sisend tuleb failist, sestap töötab
ka selline variant:
|
|||||||||
-
klaviatuurilt ehk standard inputist lugemine |
- näitab explicitly tõtta
stdin-ist:
bash# wc - tere, mina olen hobune ja hirnun hirmunult Ctl+D 1 7 43 - bash # |
|||||||||
|
kasutame nüüd nn toru | ühe programmi väljundi teise sisendiga ühendamiseks |
bash# who | wc
3 15 54 bash# eeldusel, et who väljund on selline
------------------------------------------------------------------- Oletame, et kataloogis on palju faile ja me tahame näha vaid niisuguste nimesid kus esineb mingi sõna. Seda saab teha näiteks nii: bash# ls -la | grep seesona
cat failinimi | grep -n migni_sona või cat < failinimi | grep -n
migni_sona
tema sisendisse tuleb vaid suunata reavahetustega eraldataud ASCII fail: cat minu_fail | sort või ls | sort
more failinimi
aga samuti, kui on tegemist pika kataloogi listinguga saab neid toru abil kasutada: ls -la | more
|
3. I/O suunamine kasutades deskriptoreid 0, 1 ,2
Nagu algul mainitud on igal programmil olemas nö. kolm mulku:
standard sisend
standard väljund
standard veaväljund
neid märgitakse vastavalt arvudega 0,1, 2
tavaliselt on nad kõik seotud terminaliga (klaviatuur on terminali osa mõnes mõttes), st. sisestusi oodatakse terminalilt (käsurealt juurest) ja väljund (sh. veateated) antakse terminalile.
Vaatame mõnda näidet kuidas saab standartseid
nö. andmevooge muuta:
1. kaotame ära veateated (see ei tee vigu olematuks!) | bash# ls -l sedafailipoletegelikult
ls: sedafailipoletegelikult: No such file or directory bash# bash# ls -l sedafailipoletegelikult
2> /dev/null
|
2. kaotame ära väljundi: | bash# ls 1> /dev/null
bash# |
3. seome kokku ühe programmi väljundi (1) teise sisendiga (0) | bash# ls | wc
126 126 1091 |
4. ühendame 1 ja 2 voo | nt olgu meil tarvis, et shell
script k.sh
bash# cat k.sh
bash# k.sh
, ei annaks mitte mingisugust väljundit, ei tavalist ei veateateid: proovige variante bash#k.sh >/dev/null
bash#k.sh 1>/dev/null
bash#k.sh 2>/dev/null
bash#k.sh 1>/dev/null 2> &1
viimasele on selline selgitus, et 2 voog on suunatud kokku esimesga ja esimene läheb /dev/null'i |
|
|
|
|
ls -l > kataloogi.sisu | suunab programmi standarväljundi (1) faili |
|
ls -l >> kataloogi.sisu | append'ib (lisab) (1) faili lõppu |
|
mail -s hallo imre < kiri.ise | saadab kirja subj. hallo ja saaja imre |
|
who | wc | ühendab p1 (1) p2 (0) -i |
|
k.sh 1>/dev/null 2> &1 | ühendab voo 2 1 -ga |
|
#!/bin/sh
a=5; tr "[a-z]" "[A-Z]" <<mark
cat > fail <<mark2
|
programm saab teksti str nagu oleks see sisestatud klaviatuurilt.
Praktilist rakendust omab siis, kui scripti sees on vaja teha nägu justkui oleks sisestus tulnud klaviatuurilt. |
|
#!/bin/sh
a=5; tr "[a-z]" "[A-Z]" <<\mark
|
sama asi, ainult muutujate väärtusi ei kanta üle. |