Ero sivun ”Standardivirrat” versioiden välillä

Linux.fista
Siirry navigaatioon Siirry hakuun
p (→‎Tee: wikilinkki tee-artikkeliin)
pEi muokkausyhteenvetoa
 
(14 välissä olevaa versiota 10 käyttäjän tekeminä ei näytetä)
Rivi 1: Rivi 1:
Standardivirroilla tarkoitetaan Unix- ja Linux-ohjelmien standardeja syöttö- ja tulostuskanavia. Niitä on kolme, standardisisääntulo (STDIN), standardiulostulo (STDOUT) ja standardivirhe (STDERR). Kun [[komentorivi]]llä annetaan esimerkiksi komento
[[Tiedosto:Stdstreams-notitle.svg|thumb|right|200px|Standardisyöttövirrat tilanteessa, jossa prosessia ajetaan [[terminaaliemulaattori|pääteikkunassa]] tms.]]
'''Standardivirroilla''' (engl. '''standard streams''') tarkoitetaan Unix- ja Linux-ohjelmien syöttö- ja tulostusvirtoja, joilla ohjelma kommunikoi ajoympäristönsä (useimmiten [[terminaaliemulaattori|pääteikkunan]]) kanssa. Jokaisella [[prosessi]]lla on sen käynnistyksessä avattuna kolme standardivirtaa: ''standardisyöte'' ('''stdin'''), ''standardituloste'' ('''stdout''') ja ''standardivirhe'' ('''stderr'''). Kolmen standardivirran [[tiedostokuvain|tiedostokuvaimet]] (''file descriptor'') ovat numeroitu nollasta kahteen siten, että standardisyötteellä on numerokoodi '''0''' ja standardivirheellä numerokoodi '''2'''.
 
Kun ohjelma käynnistetään valikosta tai kuvakkeen avulla, sillä ei yleensä ole pääteikkunaa, jonne lähettää standardivirtojaan, eikä näppäimistöä saa yhdistettyä standardisyötteeseen. Osa ohjelmista yhdistää standardivirran johonkin tiedostoon (usein [[piilotiedosto]]on ~/.xsession-errors) tai lokituksesta huolehtivalle ohjelmalle, mutta usein kaikki standardivirrat ohjataan [[laitetiedostot|laitetiedostoon]] [[:/dev/null]]. Kun ohjelman virheilmoitukset haluaa talteen, sen voi käynnistää komentoriviltä, jolloin standardivirtoja voi käsitellä normaaliin tapaan.
 
== Esimerkki ==
Kun [[komentorivi]]llä annetaan komento
  [[cat]]
  [[cat]]
tarkoittaa tämä sitä, että catin standardivirrat on liitetty oletuksiin, eli STDIN näppäimistöön ja STDOUT ja STDERR näyttöön. Käytännössä tämä tarkoittaa sitä, että cat odottaa merkkejä näppäimistöltä syöttääkseen ne välittömästi näytölle ([[virtuaalikonsoli]]n [[laitetiedosto]]on). Jos catin toiminnassa tapahtuu virhe, tulostetaan siitä kertova ilmoitus näytölle.
cat tutkii [[argumentti]]nsa, ja huomaa ettei sille ole annettu tiedostonimeä. Tällöin cat yksinkertaisesti kopioi sille annetun standardisyötteen standarditulosteelle.
Komentorivillä standardivirrat on liitetty terminaaliin, eli stdin näppäimistöön ja stdout ja stderr näyttöön. Käytännössä tämä siis tarkoittaa sitä, että cat odottaa merkkejä näppäimistöltä syöttääkseen ne välittömästi näytölle. Jos catin toiminnassa tapahtuu virhe, se tulostaa ilmoituksen standardivirheelle.


Jos taas annetaan komento
Jos taas annetaan komento
  cat tiedosto1
  cat tiedosto1
lukee cat tiedostoa tiedosto1 ja tulostaa sen STDOUTiin eli näytölle.
cat avaa tiedoston tiedosto1 ja lukee sitä kunnes kohtaa [[EOF|loppumerkin]], kopioiden tiedoston sisällön standarditulosteelle, eli näytölle. Komento
  cat <tiedosto1
  cat < tiedosto1
Johtaa samaan lopputulokseen kuin ylläoleva komento, mutta tässä tiedosto1 ohjataan erillisellä komennolla catin STDINiin, josta cat sitten syöttää sen STDOUTiin.
johtaa käyttäjän kannalta täysin samaan lopputulokseen kuin ylläoleva komento, mutta tässä tiedosto1 ohjataan [[komentotulkki|komentotulkin]] [[uudelleenohjaus]] operaattorilla < catin standardisyötteelle, josta cat sitten kopioi sen standarditulosteelle.


Jos tulostus halutaan ohjata toiselle ohjelmalle, voidaan käyttää esimerkiksi syntaksia
Jos ohjelman standardituloste halutaan [[putki|putkittaa]] toiselle ohjelmalle, voidaan käyttää syntaksia
  cat < tiedosto1|[[less]]
  cat < tiedosto1 | [[less]]
jossa catin tuloste putkitetaan lessille lisäkäsittelyä varten. Tässä catin STDIN on liitetty tiedostoon tiedosto1 ja STDOUT uudelleenohjattu lessille. Jos catin tuloste halutaan ohjata tiedostoon, voidaan siihen käyttää suurempi kuin -merkkiä esimerkiksi seuraavasti:
jossa catin tuloste putkitetaan lessille lisäkäsittelyä varten. Tässä catin stdin on liitetty tiedostoon tiedosto1, ja stdout uudelleenohjattu lessille. Jos catin tuloste halutaan ohjata tiedostoon, voidaan siihen käyttää komentotulkin suurempi kuin -operaattoria esimerkiksi seuraavasti:
  cat tiedosto1 > /tmp/data1
  cat tiedosto1 > /tmp/data1
Tässä cat lukee tiedostoa tiedosto1 ja ohjaa sen STDOUTin kautta tiedostoon /tmp/data1.  
Tässä cat lukee tiedostoa tiedosto1, ja ohjaa sen stdoutin kautta tiedostoon /tmp/data1.
cat tiedosto1 >> /tmp/data1
Tämä on täysin sama, mutta cat:in tuloste (tiedosto1) lisätään tiedoston /tmp/data1 loppuun. Yhden suurempi kuin -merkin tapauksessa /tmp/data1 päällekirjoitetaan, eli tiedoston mahdollinen aiempi sisältö katoaa pysyvästi.


STDERRiä ei vielä sen sijaan ole liitetty mihinkään erityiseen paikkaan, vaan virheilmoitukset tulostuvat edelleenkin ruudulle. STDERRin käsittelyyn voidaan käyttää kolmea erilaista syntaksia:
=== Stderr ===
 
Stderriä eli standardivirhettä ei yllä ole liitetty mihinkään tiedostoon tai putkeen, vaan virheilmoitukset tulostuvat suoraan ruudulle. Tämä on yleensä toivottua. Myös stderr voidaan kuitenkin uudelleenohjata komentotulkkisyntaksilla:
  cat tiedosto1 2> lista.txt
  cat tiedosto1 2> lista.txt
Ohjaa catin tulosteesta vain STDERRin tiedostoon lista.txt. Vastaavasti
Ohjaa catin tulosteesta vain stderrin tiedostoon lista.txt. Vastaavasti
  cat tiedosto1 1> lista.txt
  cat tiedosto1 1> lista.txt
ohjaisi normaaliin tapaan vain STDOUTin tiedostoon ja STDERR tulostuisi näytölle.
ohjaisi normaaliin tapaan vain stdoutin tiedostoon ja stderr tulostuisi näytölle (1> on siis täysin sama kuin >).
 
Sekä stdoutin että stderrin uudelleenohjaukseen samaan paikkaan voi käyttää komentotulkin syntaksia
cat tiedosto1 >& kaikki.txt
tai
cat tiedosto1 2>&1 > kaikki.txt
 
Nimestään huolimatta stderr ei ole pelkkä virhe- vaan myös infotuloste. Esimerkiksi dd-komennolla voi kopioida dataa ja muokata sitä muutamalla yksinkertaisella tavalla
 
echo heippa | dd conv=ucase
 
tulostaa HEIPPA ja kertoo sitten stderr-virtaan paljonko dataa käsitteli. Tämä voidaan putkittaa esimerkiksi
 
echo heippa | dd conv=ucase | rev > tulos.txt
 
jolloin putkessa eteenpäin ja lopuksi tiedostoon siirtyy stdout, ja stderr (ja näin mahdolliset virheilmoitukset) tulostuvat heti ruudulle. Tarvittaessa kunkin komennon stderr-tuloste voidaan ottaa talteen em. 2> -merkinnällä.


Sekä STDOUTin että STDERRin uudelleenohjaukseen samaan paikkaan voi käyttää syntaksia
Standardivirhe eroaa standardisyötteestä myös siten, että se on järjestelmän standardikirjaston tasolla oletuksena [[wikipedia:fi:Puskurimuisti|puskuroimaton]]. Näin ohjelman virheilmoitukset tulostuvat ruudulle aina heti.
cat tiedosto1 >& lista.txt


==Erikoistapauksia==
==Erikoistapauksia==


Eräät ohjelmat, jotka oletuksena tulostavat tiedostoon, voidaan saada tulostamaan STDOUTiin antamalla tiedostonnimeksi "- -", esimerkiksi
Eräät ohjelmat, jotka oletuksena tulostavat tiedostoon, voidaan saada tulostamaan stdoutiin antamalla tiedostonnimeksi "-" tai "-&ensp;-", esimerkiksi
  cat /home/juliste.ps | [[Ghotstscript|gs]] -q -dNOPAUSE -sDEVICE=ljet4 -r600 -sOutputFile=- -
  cat /home/juliste.ps | [[Ghotstscript|gs]] -q -dNOPAUSE -sDEVICE=ljet4 -r600 -sOutputFile=- -
Tässä gs eli Ghotstscript muuntaa catilta saamansa [[PostScript]]-tiedoston ljet4-tulostimelle sopivalle kuvauskielelle ja ohjaa tuloksen STDOUTiin eli tässä tapauksessa näytölle.
Tässä gs eli Ghostscript muuntaa catilta saamansa [[PostScript]]-tiedoston ljet4-tulostimelle sopivalle kuvauskielelle ja ohjaa tuloksen stdoutiin eli tässä tapauksessa näytölle.


== Tee ==
== Tee ==
Komentoa [[tee]] voidaan käyttää ohjaamaan sen STDINiin syötetty data sekä tiedostoon että uudelleen STDOUTiin. Esimerkiksi komento
Komentoa [[tee]] voidaan käyttää ohjaamaan sen standardisyötteelle syötetty data sekä tiedostoon että standarditulosteelle. Esimerkiksi komento
  cat tiedosto1|tee lista.txt
  cat tiedosto1 | tee lista.txt
tulostaisi tiedosto1:n sekä näytölle että tiedostoon lista.txt.
tulostaisi tiedosto1:n sekä näytölle että tiedostoon lista.txt.


Komento
Komento
  cat tiedosto1|tee lista.txt>>lista2.txt
  cat tiedosto1 | tee lista.txt >> lista2.txt
ohjaisi tiedosto1:n sekä tiedostoon lista.txt (ylikirjoittaen sen vanhan sisällön) että myös tiedoston lista2.txt loppuun (>-merkki annettu tuplana). Näytölle ei tulostu mitään, koska teen STDOUT on ohjattu tiedostoon lista2.txt.
ohjaisi tiedosto1:n sekä tiedostoon lista.txt (ylikirjoittaen sen vanhan sisällön) että myös tiedoston lista2.txt loppuun (>-merkki annettu tuplana). Näytölle ei tulostu mitään, koska teen stdout on ohjattu tiedostoon lista2.txt.


Jos halutaan, että tiedoston lista.txt sisältöä ei ylikirjoiteta, vaan uusi teksti lisätään sen loppuun, voidaan käyttää valitsinta -a:
Jos halutaan, että tiedoston lista.txt sisältöä ei ylikirjoiteta, vaan uusi teksti lisätään sen loppuun, voidaan käyttää valitsinta -a:
  cat tiedosto1|tee -a lista.txt
  cat tiedosto1 | tee -a lista.txt


==Katso myös==
==Katso myös==
*[[Komentorivin perusteet]]
*[[Komentorivin perusteet]]
*[[Nimetyt putket]]
*[[Xargs]]
*[[Nimetty putki]]


[[Luokka:Järjestelmä]]
[[Luokka:Järjestelmä]]
[[Luokka:Komentorivi]]
[[Luokka:Komentorivi]]

Nykyinen versio 26. tammikuuta 2021 kello 12.02

Standardisyöttövirrat tilanteessa, jossa prosessia ajetaan pääteikkunassa tms.

Standardivirroilla (engl. standard streams) tarkoitetaan Unix- ja Linux-ohjelmien syöttö- ja tulostusvirtoja, joilla ohjelma kommunikoi ajoympäristönsä (useimmiten pääteikkunan) kanssa. Jokaisella prosessilla on sen käynnistyksessä avattuna kolme standardivirtaa: standardisyöte (stdin), standardituloste (stdout) ja standardivirhe (stderr). Kolmen standardivirran tiedostokuvaimet (file descriptor) ovat numeroitu nollasta kahteen siten, että standardisyötteellä on numerokoodi 0 ja standardivirheellä numerokoodi 2.

Kun ohjelma käynnistetään valikosta tai kuvakkeen avulla, sillä ei yleensä ole pääteikkunaa, jonne lähettää standardivirtojaan, eikä näppäimistöä saa yhdistettyä standardisyötteeseen. Osa ohjelmista yhdistää standardivirran johonkin tiedostoon (usein piilotiedostoon ~/.xsession-errors) tai lokituksesta huolehtivalle ohjelmalle, mutta usein kaikki standardivirrat ohjataan laitetiedostoon /dev/null. Kun ohjelman virheilmoitukset haluaa talteen, sen voi käynnistää komentoriviltä, jolloin standardivirtoja voi käsitellä normaaliin tapaan.

Esimerkki[muokkaa]

Kun komentorivillä annetaan komento

cat

cat tutkii argumenttinsa, ja huomaa ettei sille ole annettu tiedostonimeä. Tällöin cat yksinkertaisesti kopioi sille annetun standardisyötteen standarditulosteelle. Komentorivillä standardivirrat on liitetty terminaaliin, eli stdin näppäimistöön ja stdout ja stderr näyttöön. Käytännössä tämä siis tarkoittaa sitä, että cat odottaa merkkejä näppäimistöltä syöttääkseen ne välittömästi näytölle. Jos catin toiminnassa tapahtuu virhe, se tulostaa ilmoituksen standardivirheelle.

Jos taas annetaan komento

cat tiedosto1

cat avaa tiedoston tiedosto1 ja lukee sitä kunnes kohtaa loppumerkin, kopioiden tiedoston sisällön standarditulosteelle, eli näytölle. Komento

cat < tiedosto1

johtaa käyttäjän kannalta täysin samaan lopputulokseen kuin ylläoleva komento, mutta tässä tiedosto1 ohjataan komentotulkin uudelleenohjaus operaattorilla < catin standardisyötteelle, josta cat sitten kopioi sen standarditulosteelle.

Jos ohjelman standardituloste halutaan putkittaa toiselle ohjelmalle, voidaan käyttää syntaksia

cat < tiedosto1 | less

jossa catin tuloste putkitetaan lessille lisäkäsittelyä varten. Tässä catin stdin on liitetty tiedostoon tiedosto1, ja stdout uudelleenohjattu lessille. Jos catin tuloste halutaan ohjata tiedostoon, voidaan siihen käyttää komentotulkin suurempi kuin -operaattoria esimerkiksi seuraavasti:

cat tiedosto1 > /tmp/data1

Tässä cat lukee tiedostoa tiedosto1, ja ohjaa sen stdoutin kautta tiedostoon /tmp/data1.

cat tiedosto1 >> /tmp/data1

Tämä on täysin sama, mutta cat:in tuloste (tiedosto1) lisätään tiedoston /tmp/data1 loppuun. Yhden suurempi kuin -merkin tapauksessa /tmp/data1 päällekirjoitetaan, eli tiedoston mahdollinen aiempi sisältö katoaa pysyvästi.

Stderr[muokkaa]

Stderriä eli standardivirhettä ei yllä ole liitetty mihinkään tiedostoon tai putkeen, vaan virheilmoitukset tulostuvat suoraan ruudulle. Tämä on yleensä toivottua. Myös stderr voidaan kuitenkin uudelleenohjata komentotulkkisyntaksilla:

cat tiedosto1 2> lista.txt

Ohjaa catin tulosteesta vain stderrin tiedostoon lista.txt. Vastaavasti

cat tiedosto1 1> lista.txt

ohjaisi normaaliin tapaan vain stdoutin tiedostoon ja stderr tulostuisi näytölle (1> on siis täysin sama kuin >).

Sekä stdoutin että stderrin uudelleenohjaukseen samaan paikkaan voi käyttää komentotulkin syntaksia

cat tiedosto1 >& kaikki.txt

tai

cat tiedosto1 2>&1 > kaikki.txt

Nimestään huolimatta stderr ei ole pelkkä virhe- vaan myös infotuloste. Esimerkiksi dd-komennolla voi kopioida dataa ja muokata sitä muutamalla yksinkertaisella tavalla

echo heippa | dd conv=ucase

tulostaa HEIPPA ja kertoo sitten stderr-virtaan paljonko dataa käsitteli. Tämä voidaan putkittaa esimerkiksi

echo heippa | dd conv=ucase | rev > tulos.txt

jolloin putkessa eteenpäin ja lopuksi tiedostoon siirtyy stdout, ja stderr (ja näin mahdolliset virheilmoitukset) tulostuvat heti ruudulle. Tarvittaessa kunkin komennon stderr-tuloste voidaan ottaa talteen em. 2> -merkinnällä.

Standardivirhe eroaa standardisyötteestä myös siten, että se on järjestelmän standardikirjaston tasolla oletuksena puskuroimaton. Näin ohjelman virheilmoitukset tulostuvat ruudulle aina heti.

Erikoistapauksia[muokkaa]

Eräät ohjelmat, jotka oletuksena tulostavat tiedostoon, voidaan saada tulostamaan stdoutiin antamalla tiedostonnimeksi "-" tai "- -", esimerkiksi

cat /home/juliste.ps | gs -q -dNOPAUSE -sDEVICE=ljet4 -r600 -sOutputFile=- -

Tässä gs eli Ghostscript muuntaa catilta saamansa PostScript-tiedoston ljet4-tulostimelle sopivalle kuvauskielelle ja ohjaa tuloksen stdoutiin eli tässä tapauksessa näytölle.

Tee[muokkaa]

Komentoa tee voidaan käyttää ohjaamaan sen standardisyötteelle syötetty data sekä tiedostoon että standarditulosteelle. Esimerkiksi komento

cat tiedosto1 | tee lista.txt

tulostaisi tiedosto1:n sekä näytölle että tiedostoon lista.txt.

Komento

cat tiedosto1 | tee lista.txt >> lista2.txt

ohjaisi tiedosto1:n sekä tiedostoon lista.txt (ylikirjoittaen sen vanhan sisällön) että myös tiedoston lista2.txt loppuun (>-merkki annettu tuplana). Näytölle ei tulostu mitään, koska teen stdout on ohjattu tiedostoon lista2.txt.

Jos halutaan, että tiedoston lista.txt sisältöä ei ylikirjoiteta, vaan uusi teksti lisätään sen loppuun, voidaan käyttää valitsinta -a:

cat tiedosto1 | tee -a lista.txt

Katso myös[muokkaa]