Syöttö ja tulostus ja niiden ohjaaminen


Standardivirrat, Syötön ja tulostuksen uudelleenohjaus, Virheilmoitusten käsittely

Standardivirrat

Unix- ja Linux-maailmassa on määritelty kolme ns. standardivirtaa, joilla määritellään, mistä haetaan syöte ja minne tulostetaan oletusarvoisesti. Nämä virrat ovat seuraavat:

  • standard input (yleensä näppäimistö) 0
  • standard output (näyttö) 1
  • standard error (näyttö) 2

Jos joku komento tarvitsee syötteitä eikä sille ole kerrottu sitä, mistä tiedostosta niitä noudetaan, haetaan nämä syötteet näppäimistöltä. Esimerkki: cat-komento liittää tekstitiedostoja yhteen ja tulostaa niitä näytölle. Jos kirjoitat riville pelkästään cat, käy näin:

$ cat
_ 

Kursori jää vain rivin alkuun odottamaan jotain ja jos kirjoitat jotain ja painat enteriä, kirjoitettu teksti toistuu. Tämä on selitettävissä juuri ns. standardivirralla: cat-komento tarvitsee tiedon siitä, mistä tiedostosta luetaan. Jos tiedostoa ei anneta, se jää odottamaan syötteitä näppäimistöltä. (CTRL-C-näppäilyllä pääsee edellä olevasta tilasta pois, jos tuli kokeiltua sitä)

Tällä samalla logiikalla cat tied1 tied2 näyttää tiedostojen tied1 ja tied2 sisällön näytöllä: sille ei ole kerrottu erikseen, mihin tiedostoon nämä tiedostot oikein yhdistetään, joten se yhdistää ne näytölle!


Syötön ja tulostuksen uudelleenohjaus

Aina ei tietenkään ole tarkoitus tulostaa näytölle ja lukea näppäimistöltä. Tällöin tarvitaan ns. syötön ja tulostuksen uudelleenohjausta. Se tapahtuu merkeillä <, > ja >>.

< lukee tiedostosta datan näppäimistön sijaan, > kirjoittaa tiedostoon näytön sijasta, >> taas kirjoittaa olemassa olevan tiedoston perään.

cat tied1 tied2 > kokotied

Yhdistää tiedostot tied1 ja tied2 tiedostoksi kokotied.

cat tied3 >> kokotied

kirjoittaa tiedoston kokotied perään.

Komennon voisi kirjoittaa myös näinkin:

cat < tied3 >> kokotied

Nykyisin syöttö jostain tiedostosta ei aina vaadi <-merkkiä komentoon. On kuitenkin jotain ohjelmia, jotka vaativat sen olemassa oloa.


Virheilmoitusten käsittely

Virheilmoitukset tulostuvat siis omaan virtaansa. Tämä aiheuttaa helposti kokemattomalle käyttäjälle yllätyksen, kun muuten siististi tausta-ajoon laitettu ohjelma tulostaakin kesken kaiken virheilmoituksia näytölle. Siksi virheilmoitukset tulee käsitellä erikseen. Esimerkiksi:

find / -name vi -print > tulos &

Ja mitähän tässä tapahtui?

  • find-komennolla etsitään tiedostoja
  • / tarkoittaa, että aloitetaan juurihakemistosta
  • name-optiolla annetaan nimi
  • print tarvitaan, jos aiotaan tulostaa jotain
  • &-merkki laittaa työn tausta-ajoon
  • > ohjaa tuloksen tiedostoon "tulos"

Tällä saat kuitenkin näytölle välillä virheilmoituksia, kun find käy läpi hakemistoja ja ilmoittaa virheistä kun ei olekaan oikeuksia mennä johonkin hakemistoon.

Korjataan asia näin:

find / -name vi -print 2>1& tulos &

Nyt sekä virheilmoitukset että haun tulos tulostuvat samaan tiedostoon. Jos taas ei kiinnosta virheilmoitusten luku, tehdään asia vaikkapa näin:

find / -name vi -print > tulos 2> /dev/null &

Luonnollisesti voit halutessasi kirjoittaa virheilmoitukset johonkin sopivaan tiedostoon "roskiksen" (/dev/null) sijasta. Huomaa, että virheilmoitusvirran kanssa tarvitaan virran numeroa. 0 ja 1 ovat oletusarvoisia virtoja, jos mitään ei mainita.


Alkuun