Ero sivun ”Standardivirrat” versioiden välillä
p (standardimpi shellisyntaksi) |
(Laajennettu. Uudelleensuomennettu standarisisääntulo > standardisyöte ja stdulostulo>stdtuloste. Virtojen nimet kirjoitetaan kirjallisuudessa yleensä pienellä.) |
||
Rivi 1: | Rivi 1: | ||
Standardivirroilla tarkoitetaan Unix- ja Linux-ohjelmien | [[Tiedosto:Stdstreams-notitle.svg|thumb|right|200px|Standardisyöttövirrat tilanteessa, jossa prosessia ajetaan [[terminaali]]ssa.]] | ||
'''Standardivirroilla''' (engl. '''standard streams''') tarkoitetaan Unix- ja Linux-ohjelmien syöttö- ja tulostusvirtoja, joilla ohjelma kommunikoi ajoympäristönsä (useimmiten [[terminaali]]n) 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ä stanrdisyötteellä on numerokoodi '''0''' ja stanrdivirheellä numerokoodi '''2'''. | |||
== Esimerkki == | |||
Kun [[komentorivi]]llä annetaan komento | |||
[[cat]] | [[cat]] | ||
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 | ||
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 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 | 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 | 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 | 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. | |||
=== 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 | Ohjaa catin tulosteesta vain stderrin tiedostoon lista.txt. Vastaavasti | ||
cat tiedosto1 1> lista.txt | cat tiedosto1 1> lista.txt | ||
ohjaisi normaaliin tapaan vain | 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 | |||
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. | |||
==Erikoistapauksia== | ==Erikoistapauksia== | ||
Eräät ohjelmat, jotka oletuksena tulostavat tiedostoon, voidaan saada tulostamaan | Eräät ohjelmat, jotka oletuksena tulostavat tiedostoon, voidaan saada tulostamaan stdoutiin antamalla tiedostonnimeksi "-" tai "- ;-", 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 Ghostscript muuntaa catilta saamansa [[PostScript]]-tiedoston ljet4-tulostimelle sopivalle kuvauskielelle ja ohjaa tuloksen | 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 | 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. | ||
Rivi 37: | Rivi 50: | ||
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 | 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: |
Versio 14. helmikuuta 2010 kello 16.09
Standardivirroilla (engl. standard streams) tarkoitetaan Unix- ja Linux-ohjelmien syöttö- ja tulostusvirtoja, joilla ohjelma kommunikoi ajoympäristönsä (useimmiten terminaalin) 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ä stanrdisyötteellä on numerokoodi 0 ja stanrdivirheellä numerokoodi 2.
Esimerkki
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.
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
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
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
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
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