Kuinka putket toimivat? Ne käyttävät kolmea viestintäkanavaa, jotka ovat tarjolla jokaiselle suoritettavlle tiedostolle.
stdin (standardisisääntulo) on oletusarvoisesti se, mitä kirjoitamme näppäimistöllä. Voimme käyttää merkkiä "<" tiedostonimen kanssa saadaksemme ohjelman ottamaan sisääntulon tiedostosta.
stdout (standardiulostulo) on oletusarvoisesti tulostus tietokoneesi ruudulle. Voimme käyttää merkkiä ">" tiedostonimen kanssa lähettääksemme tuohon tiedostoon, kirjoittaen yli kaiken sen sisällön, tai käyttää merkkejä ">>" lisätäksemme standardiulostulon tiedoston loppuun.
stderr (standardivirhe) on vaihtoehtoinen ulostulon tyyppi. Ohjelmat käyttävät sitä lähettääkseen virheviestejä. Tämä voi olla käyttökelpoista, sillä saatat tahtoa nähdä virheviestejä päätteellä, vaikka uudelleensuuntaisit ulostulon tiedostoon. Tässä on esimerkki:
$ ls *.bak > listatiedosto ls: *.bak: No such file or directory
Tässä tahdoimme listata kaikki tiedostot, jotka päättyvät ".bak". Sellaisia tiedostoja ei kuitenkaan ole tässä hakemistossa. Jos "ls"
lähetti virheviestinsä standardiulostuloon (joka on tässä tapauksessa uudelleenohjattu tiedostoon), emme tietäisi, että tässä on ongelma katsomatta tiedoston "listatiedosto" sisältöä. Mutta koska "ls
" lähetti viestinsä standardivirheeseen, näemme sen. Virheviesti alkaa ohjelman nimellä ("ls"
), jota seuraa kaksoispiste ja varsinainen virheviesti.
Putki yksinkertaisesti uudelleensuuntaa ensimmäisen ohjelman standardiulostulon toiseen ohjelmaan:
$ ls *.bak | more
Joskus tahdomme suunnata komennon ulostulon tiedostoon, mutta tahdomme myös nähdä ulostulon ohjelman toimiessa. Komento "tee"
tekee juuri sen:
$ ls -lR / | tee kaikkiTiedostoni
tarjoaa täydellisen, yksityiskohtaisen listan tiedostojärjestelmästäsi, joka tallennetaan tiedostoon "kaikkiTiedostoni". Tämän suorittaminen kestää jonkin aikaa; "tee"
pelastaa sinut tuijottamasta elotonta ruutua, ihmettellen tapahtuuko mitään.
Jokainen ohjelma voi avata paljon tiedostoja, joista jokaisella on numero, jota kutsutaan "tiedostokuvaajaksi", joka on merkityksellinen vain tuon ohjelman sisällä. Ensimmäiset kolme numeroa on aina säästetty tiedostokuvaajille, joita juuri kuvasimme.
stdin | 0 |
stdout | 1 |
stderr | 2 |
Kun uudelleensuuntaamme standardisisäänulostulon stdin, kuten teimme aiemmin, virheviestit ilmestyvät edelleenkin ruudulle. Esimerkiksi
$ ls /eisellaistapaikkaa > /dev/null ls: /eisellaistapaikkaa: No such file or directory $
Uudelleensuunnataksemme "stderr"-standardivirheviestit voimme käyttää yleisempää uudelleensuuntauksen muotoa, joka käyttää äsken mainittuja tiedostonumeroita, ja näyttää tältä:
$ ls /eisellaistapaikkaa 2>/tmp/errors $
Tämä lähettää tiedostoon numero "2" ("stderr") lähetetyn virheviestin tiedostoon "/tmp/errors".
Voimme nyt esitellä monimutkaisemman uudelleensuuntauksen, joka suuntaa standardiulostulon ja standardivirheviestit samaan tiedostoon:
$ ls *.bak > listfile 2>&1
Merkki "&" tässä komennossa ei liity mitenkään komennon laittamiseen taustalle. Merkin "&" täytyy tässä seurata suoraan merkkiä ">", ja se lähettää tiedoston numero "2" tiedostoon numero "1".
Putken tapauksessa tämä pitää laittaa ennen putkea:
$ ls *.bak 2>&1 | more
Joskus on kätevää pitää muita tiedostoja avoinna ja lisätä niihin vähitellen. Voit tehdä tämän uudelleensuuntauksella ja komennolla "exec"
.
$ exec 3>/tmp/kolmastiedosto $ exec 4>/tmp/neljästiedosto $ echo tip >&3 $ echo tap >&4 $ echo taas tip >&3 $ echo taas tap >&4 $ exec 3>&- $ exec 4>&-
Ensimmäiset kaksi riviä avaavat yhteydet kahteen muuhun tiedostokuvaajaan, jotka ovat "3" ja "4". Voimme tämän jälkeen laittaa niihin tekstiä komennolla "echo", uudelleensuunnata niihin ohjelmia ja niin edelleen, käyttäen ainoastaan komentoja ">&3
" tai ">&4"
. Lopulta voimme sulkea ne syntaksilla "3>&-"
ja "4>&-"
.
There has been error in communication with Booktype server. Not sure right now where is the problem.
You should refresh this page.