Ero sivun ”Putki” versioiden välillä
(perustietoa) |
(ei mitään eroa)
|
Versio 15. helmikuuta 2010 kello 23.15
Putkittaminen tarkoittaa toiseen ohjelman standarditulosteen ohjaamista toisen ohjelman standardisyötteelle. Se on erittäin hyödyllinen komentotulkkioperaatio, jonka hallitseminen yhdessä grep ja less -komentojen kanssa on avain Linux- ja Unix-järjestelmien komentotulkin tehokkaaseen hyödyntämiseen. Komentotulkissa putki luodaan operaattorilla ohjelma1 | ohjelma2. Merkistä | käytetään tässä yhteydessä tämän vuoksi yleensä nimeä putki.
Esimerkki
cat tulostaa argumenttina annetun tiedoston omalle standarditulosteelleen. Less ja more ovat ohjelmia, jotka normaalitilassa vierittävät standardisyötettä ruudullisen kerrallaan. Kun cat:in tuloste putkitetaan less:ille, on tulostettavaa tiedostoa helpompi lukea:
cat tiedosto | less
Putkitettavan tulosteteen ei tarvitse välttämättä olla tekstiä, vaan mitä tahansa dataa voidaan ohjata putkeen. Jos tiedosto kuva.png.gz on gzipillä pakattu PNG-kuvatiedosto, se voidaan katsoa ImageMagickin display komennolla X-ikkunassa seuraavasti:
gunzip -c kuva.png.gz | display -
Tässä gzip-jakeluun kuuluva gunzip on purkaa pakatun tiedoston kuva.png.gz. Gunzipin valitsin -c ohjaa puretun datavirran (siis alkuperäisen, pakkaamattoman kuvatiedoston) standarditulosteelle. ImageMagickin displayn argumenttina on näytettävän kuva tiedostonimi. Tiedostonimi väliviiva (-) on yleinen tapa kertoa ohjelmalle, että tiedostoa ei lueta tiedostojärjestelmästä lainkaan, vaan se annetaan datavirtana ohjelman standardisyötteelle. Lopputuloksena ImageMagick siis lukee gunzip:in purkaman tiedoston ja näyttää sen käyttäjälle.
Putkia voi olla myös useita peräkkäin, ja niitä voi yhdistellä komentotulkin uudelleenohjausoperaattoreihin mielivaltaisesti. Seuraava komento poistaa tiedostosta kayttajat.txt.gz identtiset rivit komennolla uniq, ja lopuksi pakkaa tiedoston uudelleen, sekä ohjaa pakatun tulosteen tiedostoon kayttajat-uniq.txt.gz
gzip -c kayttajat.txt.gz | uniq | gzip -c - > kayttajat-uniq.txt.gz
Standardivirhe
Putkitusoperaattori | ohjaa vain ohjelman standarditulosteen toiselle ohjelmalle. Minkä tahansa putkessa esiintyvän ohjelman virheilmoitukset tulostuvat siksi suoraan terminaaliin. Koska jokaisella ohjelmalla on vain kaksi ulostuloa (standardituloste ja -virhe) mutta vain yksi sisääntulo (standardisyöte), pitää standardivirhe ohjata erikseen standarditulosteelle, jotta se voitaisiin putkittaa toiselle ohjelmalle. Tämä tapahtuu komentamalla
ohjelma1 2>&1 | ohjelma2
Jos jonkin putkessa olevan ohjelman standardivirhettä ei haluta putkittaa toiselle ohjelmalle, mutta sitä ei myöskään haluta näkyville terminaaliin, se voidaan ohjata erikoistiedostoon /dev/null esimerkiksi seuraavasti:
ohjelma1 | ohjelma2 2> /dev/null | ohjelma3
Tämä ohjaa ohjelma2:n mahdolliset virheilmoitukset null:ille. ohjelma1:n ja ohjelma3:n virheilmoitukset tulostuvat normaalisti terminaaliin.