Mis on Bashis stdin, stderr ja stdout?

What Are Stdin Stderr



Kui käivitate terminalis mis tahes käske, stdin , stderr ja stdout on kolm andmevoogu, mille bash loob. Kui olete käsurealt tuttav, olete võib -olla juba neid funktsioone kasutanud. Põhimõtteliselt võimaldavad need torujuhtimist/ümbersuunamist ühest käsust teise.

Vaatame, kuidas stdin , stderr ja stdout töötab ja kuidas saate neid ka kasutada.







stdin, stdout ja stderr

Arvutamisel viitab mõiste voog millelegi, mis võib andmeid edastada. Siin kannavad kõik kolm voogu andmetena teksti.



Sarnaselt veevoogudele on andmevoogudel ka kaks lõpp -punkti. Seal on allikas ja väljavool. Ükskõik milline käsk, mida terminalis kasutate, asub voo mõlemas kohas. Voo abil saate ühendada kaks terminaliakent, kaks erinevat käsku ja isegi faile!



Vaatame kiiresti eri voogusid.





  • stdin: tähistab standardset sisendit. See võtab teksti sisendina.
  • stdout: tähistab standardväljundit. Käsu tekstiväljund salvestatakse stdout -voos.
  • stderr: tähistab standardviga. Kui käsul ilmneb tõrge, salvestatakse veateade sellesse voogu.

Linuxis käsitletakse peaaegu kõiki vooge nii, nagu oleksid need failid. Nii nagu saate faili lugeda/kirjutada, saate ka nende voogude andmeid lugeda/kirjutada.

Lihtne viis mis tahes failile juurde pääseda on sellega seotud kordumatu failikirjelduse numbri kasutamine. Nende voogude puhul on igale neist määratud unikaalsed väärtused.



  • 0: stdin
  • 1: stdout
  • 2: stderr

stdin, stdout ja stderr tegevuses

Alustuseks õpime nende voogude kohta tegevuse kaudu rohkem, alustame stdiniga.

Käivitage järgmine käsk.

$loe

Käsk nõuab sisestamist klaviatuurilt. Siin saab lugemistööriist stdinilt sisendi. Vaatame nüüd stdouti.

Esmalt käivitage käsk.

$ls -neid

Siin loetleb käsk ls praeguses kataloogis olevad failid. Nimekiri saadetakse aadressile stdout ja terminal prindib selle välja. Kontrollime nüüd stderrit.

Viga võib esineda mitmel viisil. Selle näite puhul saadab ls vale argumendi tõrke.

$ls -neidmidagi

Siin pole ühtegi faili nimega. Sellepärast saadetakse sõnum ls return stderr .

Torustik

See on tavaline tehnika, mis kasutab täielikult ära stdin- ja stdout -vooge. Selgitame seda näitega.

$viskas välja 'Tere, Maailm' | haaretTere

Siin, | märk vastutab torustiku eest. Väljund viskas välja genereerib on kirjutatud stdout oja. Seejärel suunab torustik käskluse grep jaoks stdout sisu stdinile ümber. Nii teab grep, millise sisuga toimingut teha.

Kui soovite suunata nii stderri kui ka stdouti järgmisele käsule, kasutage selle asemel | &.

$viskas väljaTere, Maailm| & kass

$midagi| & kass

Voogude ümbersuunamine

Nüüd teame, kuidas need voogud toimivad, vaatame, kuidas saate neid ümber suunata. Torustik on ümbersuunamise vorm. Kuid see hõlmab ainult stdin ja stdout. Bash võimaldab konkreetset kontrolli kõigi kolme voo üle.

Stdout -sisu failile ümbersuunamiseks lisage nurk>, millele järgneb sihtfaili nimi.

$viskas väljaTere, Maailm>tere.txt

Siin salvestatakse kaja käsu väljund faili hello.txt.

Kui fail on juba olemas, kirjutab ülaltoodud käsk selle üle. Selle vältimiseks veenduge, et faili nimi on kordumatu. Kui te ei soovi üle kirjutada, võite selle asemel kasutada >>. See lisab väljundi sihtfaili lõppu.

$viskas välja 'Tere, Maailm' >>tere.txt

Stdin eesmärk on töötada sisendiga. Seda saab ka ümber suunata. Näiteks selle asemel, et sisestada sisend klaviatuurilt, saab selle laadida failist.

Selle käsu puhul võtab kass oma sisendi otse failist hello.txt.

$kass <tere.txt

Vaatame ümbersuunamist teise näitega. Seekord hõlmab see Pythoni skripti.

$# pyin.py
$ nimi= sisend('Sisestage nimi n')
$meilile = sisend('Sisestage e -posti aadress n')
$printida('Teie nimi on %s ja e -post on %s'%(nimi, meilile))

Skripti sisend asub aadressil hello.txt.

$kasstere.txt

Saadame faili skripti sisendina.

$ python3 pyin.py <Tere.txt

Huvitav on see, et saate mõlemad suunata stdin ja stdout samas käsureal. Siin kasutab järgmine käsk hello.txt kui stdin ja saatke stdout käsust faili.

$ python3 pyin.py <Tere.txt >väljund.txt

Stderri ümbersuunamine sarnaneb stdoutiga. Siiski peate stderr tähistamiseks mainima kirjelduse ID 2. Vastasel juhul kasutab see lihtsalt stdouti.

Siin suunan kausta sisu ümber stderr tekstifailile.

$midagi2>error.txt

Stdouti ja Stderri ümbersuunamine

Jah, mõlemat on võimalik samaaegselt ümber suunata. Enne ümbersuunamist peate mainima kirjelduse ID 1 ja 2.

$viskas väljaTere, Maailm1>output.log2>silumine.log

Lõplikud mõtted

stdin , stdout ja stderr on suurepärased funktsioonid bash pakub vaikimisi. Kui tegelete bash -skriptidega, võib nende kasutamine keerulistes olukordades uskumatult kasulik olla.

Kas soovite bash -skriptimise kohta rohkem teada saada? Alustame sellest algajate bash -skriptimise juhend !

Nautige!