Kas yra stdin, stderr ir stdout Bash

What Are Stdin Stderr



Kai terminale paleisite bet kurią komandą, stdin , stderr , ir stdout yra trys duomenų srautai, kuriuos sukuria „bash“. Jei esate susipažinęs su komandine eilute, galbūt jau pasinaudojote šiomis funkcijomis. Iš esmės jie leidžia perduoti/nukreipti duomenis iš vienos komandos į kitą.

Patikrinkime, kaip stdin , stderr , ir stdout veikia ir kaip galite juos naudoti.







stdin, stdout ir stderr

Kompiuterijoje terminas srautas reiškia tai, kas gali perduoti duomenis. Čia visi trys srautai neša tekstą kaip duomenis.



Duomenų srautai, kaip ir vandens srautai, taip pat turi du galinius taškus. Yra šaltinis ir nutekėjimas. Bet kokia komanda, kurią vykdote terminale, bus bet kuriame srauto taške. Naudodami srautą galite prijungti du terminalo langus, dvi skirtingas komandas ir net failus!



Greitai suskaidykime specialius srautus.





  • stdin: reiškia standartinį įvestį. Kaip įvestis naudojamas tekstas.
  • stdout: reiškia standartinę išvestį. Komandos teksto išvestis saugoma stdout sraute.
  • stderr: reiškia standartinę klaidą. Kai komandai kyla klaida, klaidos pranešimas saugomas šiame sraute.

„Linux“ beveik visi srautai traktuojami taip, tarsi jie būtų failai. Kaip ir skaityti/rašyti failą, galite skaityti/rašyti šių srautų duomenis.

Lengvas būdas pasiekti bet kurį failą yra naudojant su juo susietą unikalų failo aprašymo numerį. Šių srautų atveju kiekvienam iš jų priskiriamos unikalios vertės.



  • 0: stdinas
  • 1: stdout
  • 2: stderr

stdin, stdout ir stderr veikiant

Pradėkime nuo veiksmų, sužinoję daugiau apie šiuos srautus, pradėsime nuo stdin.

Vykdykite šią komandą.

$skaityti

Komandą reikės įvesti iš klaviatūros. Čia skaitymo įrankis gauna įvestį iš stdin. Dabar pažvelkime į stdout.

Pirmiausia paleiskite komandą.

$ls -jie

Čia komanda ls išvardija dabartiniame kataloge esančius failus. Sąrašas siunčiamas į stdout ir terminalas jį išspausdina. Dabar patikrinkime stderr.

Yra įvairių būdų, kaip gali atsirasti klaida. Šiame pavyzdyje nusiuntus neteisingą argumentą atsiras klaida.

$ls -jiebet ką

Čia nėra nieko pavadinto failo. Štai kodėl pranešimas ls return siunčiamas stderr .

Vamzdynai

Tai yra įprasta technika, kuri visiškai išnaudoja stdin ir stdout srautus. Paaiškinkime tai pavyzdžiu.

$išmetė 'Labas pasauli' | suimtiSveiki

Čia | ženklas yra atsakingas už vamzdynus. Išvestis išmetė sukuria parašyta stdout srautas. Tada vamzdynai peradresuoja stdout turinį į stdin, kad gautų komandą grep. Taip grep žino, kokiam turiniui atlikti operaciją.

Jei norite nukreipti ir stderr, ir stdout į kitą komandą, naudokite | &.

$išmetėLabas pasauli| & katė

$bet ką| & katė

Srautų nukreipimas

Dabar mes žinome, kaip veikia šie srautai, pažvelkime, kaip galite juos nukreipti. Vamzdynai yra peradresavimo forma. Tačiau tai apima tik stdin ir stdout. „Bash“ leidžia konkrečiai valdyti visus tris srautus.

Jei norite nukreipti „stdout“ turinį į failą, pridėkite> kampą ir tikslo failo pavadinimą.

$išmetėLabas pasauli>sveiki.txt

Čia komandos „echo“ išvestis bus saugoma faile „hello.txt“.

Jei failas jau buvo, aukščiau pateikta komanda jį perrašys. Norėdami to išvengti, įsitikinkite, kad failo pavadinimas yra unikalus. Jei nenorite perrašyti, galite naudoti >>. Jis prideda išvestį tikslinio failo pabaigoje.

$išmetė 'Labas pasauli' >>sveiki.txt

„Stdin“ tikslas yra dirbti su įvestimi. Tai taip pat galima nukreipti. Pvz., Užuot įvedę įvestį iš klaviatūros, ją galima įkelti iš failo.

Šioje komandoje katė įves duomenis tiesiai iš failo hello.txt.

$katė <sveiki.txt

Patikrinkime peradresavimą kitu pavyzdžiu. Šį kartą tai apims „Python“ scenarijų.

$# pyin.py
$ pavadinimas= įvesties('Įveskite vardą n')
$paštą = įvesties('Įveskite el n')
$spausdinti(„Jūsų vardas %s, o el. Pašto adresas - %s“%(vardas, paštą))

Skripto įvestis yra hello.txt.

$katėsveiki.txt

Siųskime failą kaip scenarijaus įvestį.

$ python3 pyin.py <Sveiki.txt

Įdomu tai, kad galite nukreipti abu stdin ir stdout toje pačioje komandinėje eilutėje. Čia ši komanda naudos hello.txt kaip stdin ir atsiųsti stdout komandą į failą.

$ python3 pyin.py <Sveiki.txt >produkcija.txt

Peradresavimas stderr yra panašus į stdout. Tačiau norėdami nurodyti stderr, turite paminėti aprašo ID 2. Priešingu atveju jis naudos tik stdout.

Čia aš peradresuosiu turinį stderr į teksto failą.

$bet ką2>error.txt

Peradresavimas Stdout ir Stderr

Taip, juos abu galima nukreipti vienu metu. Prieš peradresavimą tereikia paminėti aprašo ID 1 ir 2.

$išmetėLabas pasauli1>output.log2>debug.log

Galutinės mintys

stdin , stdout , ir stderr yra nuostabios „bash“ funkcijos pagal numatytuosius nustatymus. Jei mėgstate „bash“ scenarijus, jų naudojimas gali būti neįtikėtinai naudingas sudėtingose ​​situacijose.

Norite sužinoti daugiau apie „bash“ scenarijus? Pradėkime nuo to pradedančiųjų „bash“ scenarijų vadovas !

Mėgautis!