Što su stdin, stderr i stdout u Bashu

What Are Stdin Stderr



Kad god pokrenete bilo koju naredbu u terminalu, stdin , stderr , i stdout tri su toka podataka koje bash stvara. Ako ste upoznati s naredbenim retkom, možda ste već iskoristili ove značajke. U osnovi, dopuštaju prijenos podataka/preusmjeravanje podataka iz jedne naredbe u drugu.

Provjerimo kako stdin , stderr , i stdout radi i kako ih možete koristiti.







stdin, stdout i stderr

U računarstvu se termin stream odnosi na nešto što može prenositi podatke. Ovdje sva tri toka nose tekst kao podatke.



Slično kao i vodeni tokovi, tokovi podataka također imaju dvije krajnje točke. Postoje izvor i odljev. Koju god naredbu pokrenete u terminalu bit će na bilo kojoj točki toka. Pomoću streama možete spojiti dva terminala, dvije različite naredbe, pa čak i datoteke!



Hajde da nakratko analiziramo posebne tokove.





  • stdin: Označava standardni ulaz. Za unos je potreban tekst.
  • stdout: Označava standardni izlaz. Tekstualni izlaz naredbe pohranjen je u stdout streamu.
  • stderr: Označava standardnu ​​pogrešku. Kad god se naredba suoči s pogreškom, poruka o pogrešci sprema se u ovaj tok.

U Linuxu se gotovo svi tokovi tretiraju kao da su datoteke. Baš kao što možete čitati/pisati datoteku, možete čitati/pisati podatke iz ovih tokova.

Jednostavan način pristupa bilo kojoj datoteci je pomoću jedinstvenog broja deskriptora datoteke koji je s njom povezan. U slučaju ovih tokova, svakom od njih dodijeljene su jedinstvene vrijednosti.



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

stdin, stdout i stderr na djelu

Počnimo učiti više o tim strujanjima kroz radnju, počet ćemo sa stdin.

Pokrenite sljedeću naredbu.

$čitati

Naredba će zahtijevati unos s tipkovnice. Ovdje alat za čitanje dobiva ulaz od stdin -a. Pogledajmo sada stdout.

Prvo pokrenite naredbu.

$ls -

Ovdje naredba ls navodi datoteke (datoteke) u trenutnom direktoriju. Popis se šalje na adresu stdout a terminal ga ispisuje. Provjerimo sada stderr.

Do greške može doći na različite načine. U ovom primjeru, slanje nevažećeg argumenta rezultirat će pogreškom.

$ls -bilo što

Ovdje nema datoteke koja bi imenovala bilo što. Zato se šalje poruka ls Returns stderr .

Cijevi

Ovo je uobičajena tehnika koja u potpunosti iskorištava stdin i stdout tokove. Objasnimo to primjerom.

$izbaciti 'Pozdrav svijete' | zahvatzdravo

Ovdje, | znak je odgovoran za cjevovode. Izlaz izbaciti generira napisano je u stdout tok. Zatim, cjevovod preusmjerava sadržaj stdouta na stdin za naredbu grep. Tako grep zna na kojem će sadržaju izvesti operaciju.

Ako želite prenijeti i stderr i stdout na sljedeću naredbu, umjesto toga upotrijebite | &.

$izbacitiPozdrav svijete| & mačka

$bilo što| & mačka

Preusmjeravanje tokova

Sada znamo kako ti streamovi funkcioniraju, pogledajmo kako ih možete preusmjeriti. Cjevovodi su oblik preusmjeravanja. Međutim, to uključuje samo stdin i stdout. Bash omogućuje specifičnu kontrolu nad sva tri toka.

Za preusmjeravanje stdout sadržaja u datoteku, dodajte> angle i naziv ciljne datoteke.

$izbacitiPozdrav svijete>hello.txt

Ovdje će izlaz naredbe echo biti pohranjen u datoteci hello.txt.

Ako datoteka već postoji, gornja naredba će je prebrisati. Da biste to izbjegli, provjerite je li naziv datoteke jedinstven. Ako ne želite prebrisati, umjesto toga možete upotrijebiti >>. Dodaje izlaz na kraju ciljne datoteke.

$izbaciti 'Pozdrav svijete' >>hello.txt

Cilj stdina je raditi s ulazom. To se također može preusmjeriti. Na primjer, umjesto upisivanja unosa s tipkovnice, može se učitati iz datoteke.

U ovoj naredbi, cat će uzeti svoj ulaz izravno iz datoteke hello.txt.

$mačka <hello.txt

Provjerimo preusmjeravanje na drugom primjeru. Ovaj put, to će uključivati ​​Python skriptu.

$# pyin.py
$ name= ulazni('Unesite ime n')
$e -mail = ulazni('Unesite e -poštu n')
$ispisati('Vaše ime je %s, a adresa e -pošte je %s'%(Ime, e -mail))

Ulaz za skriptu nalazi se na hello.txt.

$mačkahello.txt

Pošaljimo datoteku kao ulaz za skriptu.

$ python3 pyin.py <zdravo.txt

Zanimljivo je da oboje možete preusmjeriti stdin i stdout u istom naredbenom retku. Ovdje će sljedeća naredba koristiti hello.txt kao stdin i poslati stdout naredbe za datoteku.

$ python3 pyin.py <zdravo.txt >izlaz.txt

Preusmjeravanje stderr je slično stdout. Međutim, morate spomenuti opis opisa 2 za označavanje stderr. U suprotnom će koristiti samo stdout.

Ovdje ću preusmjeriti sadržaj stderr u tekstualnu datoteku.

$bilo što2>error.txt

Preusmjeravanje Stdouta i Stderra

Da, moguće je preusmjeriti oboje istovremeno. Sve što trebate je spomenuti opis ID 1 i 2 prije preusmjeravanja.

$izbacitiPozdrav svijete1>izlaz.log2>debug.log

Završne misli

stdin , stdout , i stderr izvrsne su značajke koje bash prema zadanim postavkama nudi. Ako volite bash skripte, njihova upotreba može biti nevjerojatno korisna u nezgodnim situacijama.

Želite li saznati više o bash skriptiranju? Počnimo s ovim vodič za početnike za bash skriptiranje !

Uživati!