Katsotaanpa kuinka stdin , stderr ja stdout toimii ja miten voit myös käyttää niitä.
stdin, stdout ja stderr
Laskennassa termi stream viittaa johonkin, joka voi siirtää dataa. Tässä kaikissa kolmessa virtassa on tekstiä datana.
Samoin kuin vesivirtoja, tietovirroilla on myös kaksi päätepistettä. On lähde ja ulosvirtaus. Mikä tahansa komento, jota suoritat päätelaitteessa, on streamin kummassakin kohdassa. Striimin avulla voit yhdistää kaksi pääteikkunaa, kaksi eri komentoa ja jopa tiedostoja!
Tarkastellaanpa erikoisvirtoja nopeasti.
- stdin: Vakiotulo. Se käyttää tekstiä syöttönä.
- stdout: Vakiolähtö. Komennon tekstilähtö tallennetaan stdout -virtaan.
- stderr: tarkoittaa standardivirhettä. Aina kun komento kohtaa virheen, virhesanoma tallennetaan tähän virtaan.
Linuxissa lähes kaikkia virtoja käsitellään ikään kuin ne olisivat tiedostoja. Aivan kuten voit lukea/kirjoittaa tiedoston, voit lukea/kirjoittaa tietoja näistä virroista.
Helppo tapa käyttää mitä tahansa tiedostoa on käyttää siihen liittyvää ainutlaatuista tiedostonkuvausnumeroa. Näiden virtojen tapauksessa kullekin niistä on annettu yksilöllisiä arvoja.
- 0: stdin
- 1: vakio
- 2: stderr
stdin, stdout ja stderr toiminnassa
Aloitetaan oppimalla lisää näistä virroista toiminnan kautta, aloitamme stdinillä.
Suorita seuraava komento.
$lukea
Komento vaatii näppäimistön syötteen. Tässä lukutyökalu saa panoksen stdin: ltä. Katsotaan nyt stdoutia.
Suorita komento ensin.
$ls -he
Tässä ls -komento luettelee nykyisen hakemiston tiedostot. Lista lähetetään osoitteeseen stdout ja pääte tulostaa sen. Tarkistetaan nyt stderr.
Virhe voi tapahtua eri tavoin. Tässä esimerkissä virheellisen argumentin lähettäminen johtaa virheeseen.
$ls -hemitä tahansa
Tässä ei ole mitään tiedostoa nimeltä. Siksi palautusviesti lähetetään osoitteeseen stderr .
Putkisto
Tämä on yleinen tekniikka, joka hyödyntää täysimääräisesti stdin- ja stdout -virtoja. Selitetään se esimerkillä.
$heitti pois 'Hei maailma' | pitoHei
Tässä | merkki vastaa putkistosta. Lähtö heitti pois luo on kirjoitettu stdout stream. Sitten putkisto ohjaa stdout -sisällön stdin: lle grep -komentoa varten. Näin grep tietää, millä sisällöllä toiminto suoritetaan.
Jos haluat ohjata sekä stderr että stdout seuraavaan komentoon, käytä | & sen sijaan.
$heitti poisHei maailma| & kissa$mitä tahansa| & kissa
Virtojen uudelleenohjaus
Nyt tiedämme, miten nämä virrat toimivat, katsotaanpa, miten voit ohjata ne uudelleen. Putkisto on eräänlainen uudelleenohjaus. Se sisältää kuitenkin vain stdin ja stdout. Bash sallii kaikkien kolmen virran erityisen hallinnan.
Jos haluat ohjata stdout -sisällön tiedostoon, lisää> kulma ja kohdetiedoston nimi.
$heitti poisHei maailma>hello.txt
Tässä echo -komennon tulos tallennetaan hello.txt -tiedostoon.
Jos tiedosto on jo olemassa, yllä oleva komento korvaa sen. Vältä se varmistamalla, että tiedostonimi on yksilöllinen. Jos et halua korvata, voit käyttää sen sijaan >>. Se liittää tuloksen kohdetiedoston loppuun.
$heitti pois 'Hei maailma' >>hello.txt
Stdinin tavoite on työskennellä panoksen kanssa. Tämän voi myös ohjata uudelleen. Esimerkiksi sen sijaan, että kirjoittaisit syötteen näppäimistöltä, se voidaan ladata tiedostosta.
Tässä komennossa kissa ottaa syötteen suoraan hello.txt -tiedostosta.
$kissa <hello.txt
Tarkastellaan uudelleenohjausta eri esimerkillä. Tällä kertaa siihen liittyy Python -komentosarja.
$# pyin.py$ nimi= tulo('Anna nimi n'')
$sähköposti = tulo('Syötä sähköposti n'')
$Tulosta('Nimesi on %s ja sähköpostiosoite on %s'%(nimi, sähköposti))
Komentosarjan syöte sijaitsee osoitteessa hello.txt.
$kissahello.txt
Lähetetään tiedosto komentosarjan syötteeksi.
$ python3 pyin.py <Hei.txt
Mielenkiintoista on, että voit ohjata molemmat stdin ja stdout samassa komentorivissä. Tässä seuraava komento käyttää hello.txt -tiedostoa muodossa stdin ja lähetä stdout komennosta tiedostoon.
$ python3 pyin.py <Hei.txt >lähtö.txt
Stderrin uudelleenohjaus on samanlainen kuin stdout. Sinun on kuitenkin mainittava kuvaus ID 2 stderr: n osoittamiseksi. Muuten se käyttää vain stdoutia.
Tässä ohjaan sisällön uudelleen stderr tekstitiedostoon.
$mitä tahansa2>error.txt
Stdoutin ja Stderrin uudelleenohjaus
Kyllä, on mahdollista ohjata molemmat samanaikaisesti. Sinun tarvitsee vain mainita kuvaus ID 1 ja 2 ennen uudelleenohjausta.
$heitti poisHei maailma1>output.log2>debug.log
Lopulliset ajatukset
stdin , stdout ja stderr ovat upeita ominaisuuksia bash tarjoaa oletusarvoisesti. Jos pidät bash -komentosarjoista, niiden käyttö voi olla uskomattoman hyödyllistä hankalissa tilanteissa.
Haluatko oppia lisää bash -komentosarjoista? Aloitetaan tästä aloittelijan opas bash -komentosarjoihin !
Nauttia!