Kas yra „stdin“, „stdout“ ir „stderr“ sistemoje „Linux“?

Terminalo langas Linux kompiuteryje

Fatmawati Achmad Zaenuri / Shutterstock.com



|_+_|, |_+_| ir |_+_| yra trys duomenų srautai, sukurti paleidus Linux komandą. Galite juos naudoti norėdami sužinoti, ar jūsų scenarijai yra perduodami vamzdžiais, ar peradresuojami. Mes parodome, kaip.

Srautai sujungia du taškus

Kai tik pradėsite mokytis apie Linux ir Unix tipo operacines sistemas, susidursite su terminais |_+_|, |_+_| ir |_+_|. Šitie yra trys standartiniai srautai kurios nustatomos vykdant Linux komandą. Skaičiuojant srautas yra kažkas, kas gali perduoti duomenis. Šių srautų atveju tie duomenys yra tekstas.





Duomenų srautai, kaip ir vandens srautai, turi du galus. Jie turi šaltinį ir ištekėjimą. Nesvarbu, kurią Linux komandą naudojate, yra vienas kiekvieno srauto galas. Kitas galas nustatomas pagal apvalkalą, kuris paleido komandą. Tas galas bus prijungtas prie terminalo lango, prijungtas prie vamzdžio arba nukreiptas į failą ar kitą komandą pagal komandų eilutę, kuri paleido komandą.

„Linux“ standartiniai srautai

Linux sistemoje |_+_| yra standartinis įvesties srautas. Tai priima tekstą kaip įvestį. Teksto išvestis iš komandos į apvalkalą pristatoma naudojant |_+_| (standartinis išėjimas) srautas. Klaidos pranešimai iš komandos siunčiami per |_+_| (standartinė klaida) srautas.



Taigi matote, kad yra du išvesties srautai, |_+_| ir |_+_| ir vienas įvesties srautas, |_+_|. Kadangi klaidų pranešimai ir įprastinė išvestis turi savo kanalą, perkeliantį juos į terminalo langą, juos galima tvarkyti nepriklausomai vienas nuo kito.

Srautai tvarkomi kaip failai

Srautai sistemoje „Linux“, kaip ir beveik visa kita, laikomi failais. Galite skaityti tekstą iš failo ir rašyti tekstą į failą. Abu šie veiksmai apima duomenų srautą. Taigi duomenų srauto kaip failo tvarkymo koncepcija nėra tokia sudėtinga.

Skelbimas

Kiekvienam su procesu susietam failui priskiriamas unikalus numeris, leidžiantis jį identifikuoti. Tai žinoma kaip failo aprašas. Kai faile reikia atlikti veiksmą, failo aprašas naudojamas failui identifikuoti.



Šios reikšmės visada naudojamos |_+_|, |_+_| ir |_+_|:

  • 0 : stdin
  • vienas : stdout
  • du : stderr

Reagavimas į vamzdžius ir nukreipimus

Norint palengvinti įvadą į dalyką, įprastas būdas yra mokyti supaprastintą temos versiją. Pavyzdžiui, kalbant apie gramatiką, mums sakoma, kad taisyklė yra I prieš E, išskyrus po C. Bet iš tikrųjų ten yra daugiau šios taisyklės išimčių nei yra tam paklūstančių atvejų.

Panašiai kalbant apie |_+_|, |_+_| ir |_+_| patogu išsklaidyti priimtą aksiomą, kad procesas nei žino, nei jam rūpi, kur baigiasi trys jo standartiniai srautai. Ar procesui turėtų būti svarbu, ar jo išvestis bus nukreipta į terminalą, ar peradresuojama į failą? Ar jis netgi gali pasakyti, ar jo įvestis gaunama iš klaviatūros, ar į ją perduodama iš kito proceso?

Tiesą sakant, procesas žino (arba bent jau gali sužinoti, jei nuspręs patikrinti) ir gali atitinkamai pakeisti savo elgesį, jei programinės įrangos autorius nusprendė pridėti šią funkciją.

Skelbimas

Šį elgesio pasikeitimą matome labai lengvai. Išbandykite šias dvi komandas:

stdin

stdout

|_+_| komanda elgiasi kitaip, jei jos išvestis (|_+_|) įvedama į kitą komandą. Tai |_+_| kuri persijungia į vieno stulpelio išvestį, tai nėra konversija, kurią atlieka |_+_|. Ir |_+_| daro tą patį, jei jo išvestis peradresuojama:

stderr

stdin

stdout ir stderr peradresavimas

Privalumas yra tai, kad klaidų pranešimai pateikiami specialiu srautu. Tai reiškia, kad galime nukreipti komandos išvestį (|_+_|) į failą ir vis tiek matyti bet kokius klaidų pranešimus (|_+_|) terminalo lange. Jei reikia, galite reaguoti į klaidas, kai jos atsiranda. Tai taip pat neleidžia klaidų pranešimams užteršti failo, kuris |_+_| buvo peradresuotas į.

Įveskite šį tekstą į redaktorių ir išsaugokite jį faile error.sh.

stdout

Padarykite scenarijų vykdomą naudojant šią komandą:

stederr

Pirmoji scenarijaus eilutė atkartoja tekstą į terminalo langą per |_+_| srautas. Antroji eilutė bando pasiekti failą, kurio nėra. Tai sugeneruos klaidos pranešimą, kuris bus pristatytas per |_+_|.

Paleiskite scenarijų šia komanda:

stdin

Matome, kad abu išvesties srautai |_+_| ir |_+_|, buvo rodomi terminalo languose.

Pabandykime nukreipti išvestį į failą:

stdout

Skelbimas

Klaidos pranešimas, kuris pateikiamas per |_+_| vis tiek siunčiamas į terminalo langą. Galime patikrinti failo turinį, kad pamatytume, ar |_+_| išvestis pateko į failą.

stderr

Išvestis iš |_+_| buvo peradresuotas į failą, kaip ir tikėtasi.

|_+_| peradresavimo simbolis veikia su |_+_| pagal nutylėjimą. Galite naudoti vieną iš skaitmeninių failų deskriptorių, kad nurodytumėte, kurį standartinį išvesties srautą norite peradresuoti.

Norėdami aiškiai peradresuoti |_+_|, naudokite šią peradresavimo instrukciją:

stdout

Norėdami aiškiai peradresuoti |_+_|, naudokite šią peradresavimo instrukciją:

stderr

Pabandykime dar kartą, o šį kartą naudosime |_+_|:

stdin

Klaidos pranešimas nukreipiamas ir |_+_| |_+_| į terminalo langą siunčiamas pranešimas:

Pažiūrėkime, kas yra capture.txt faile.

stdin

|_+_| pranešimas yra Capture.txt, kaip ir tikėtasi.

Peradresavimas ir stdout, ir stderr

Žinoma, jei galime peradresuoti arba |_+_| arba |_+_| į failą nepriklausomai vienas nuo kito, turėtume juos abu vienu metu nukreipti į du skirtingus failus?

Skelbimas

Taip, mes galime. Ši komanda nukreips |_+_| į failą Capture.txt ir |_+_| į failą, pavadintą error.txt.

stdout,

Kadangi abu išvesties srautai – standartinė išvestis ir standartinė klaida – yra nukreipiami į failus, terminalo lange nėra matomos išvesties. Mes grįžtame į komandų eilutės eilutę, tarsi nieko nebūtų įvykę.

Patikrinkime kiekvieno failo turinį:

stderr stdin

stdout ir stderr nukreipimas į tą patį failą

Tai puiku, kiekvienas standartinis išvesties srautas patenka į tam skirtą failą. Vienintelis kitas derinys, kurį galime padaryti, yra siųsti abu |_+_| ir |_+_| į tą patį failą.

Tai galime pasiekti naudodami šią komandą:

stdout

Suskaidykime tai.

  • ./error.sh : paleidžiamas error.sh scenarijaus failas.
  • > Capture.txt : peradresuoja |_+_| srautas į Capture.txt failą. |_+_| yra santrumpa |_+_|.
  • 2> ir 1 : naudojama &> peradresavimo instrukcija. Ši instrukcija leidžia jums nurodyti apvalkalui, kad vienas srautas pasiektų tą patį tikslą kaip kitas srautas. Šiuo atveju sakome, kad peradresuokite 2 srautą |_+_| į tą pačią vietą, į kurią nukreipiamas 1 srautas |_+_|.

Nėra matomos išvesties. Tai skatina.

Patikrinkime Capture.txt failą ir pažiūrėkime, kas jame yra.

stderr

Tiek |_+_| ir |_+_| srautai buvo nukreipti į vieną paskirties failą.

Jei norite, kad srauto išvestis būtų peradresuota ir tyliai pašalinta, nukreipkite išvestį į |_+_|.

Peradresavimo aptikimas scenarijuje

Aptarėme, kaip komanda gali aptikti, ar kuris nors srautas yra peradresuojamas, ir gali pasirinkti atitinkamai pakeisti savo elgesį. Ar galime tai padaryti pagal savo scenarijus? Taip, mes galime. Ir tai labai lengva suprasti ir pritaikyti.

Skelbimas

Įveskite šį tekstą į redaktorių ir išsaugokite jį kaip input.sh.

ls

Naudokite šią komandą, kad ji būtų vykdoma:

stdout

Protinga dalis yra bandymas laužtiniuose skliaustuose . |_+_| (terminalo) parinktis grąžina true (0), jei failas susietas su failo aprašu baigiasi terminalo lange . Kaip testo argumentą naudojome failo deskriptorių 0, kuris reiškia |_+_|.

Jei |_+_| yra prijungtas prie terminalo lango, testas pasitvirtins. Jei |_+_| prijungtas prie failo arba vamzdžio, bandymas nepavyks.

Galime naudoti bet kurį patogų tekstinį failą, kad sukurtume scenarijaus įvestį. Čia mes naudojame vieną, vadinamą dummy.txt.

ls

Išvestis rodo, kad scenarijus atpažįsta, kad įvestis gaunama ne iš klaviatūros, o iš failo. Jei pasirinksite, galite atitinkamai pakeisti savo scenarijaus elgesį.

Skelbimas

Tai buvo su failo peradresavimu, pabandykime su vamzdžiu.

cat

Scenarijus atpažįsta, kad jo įvestis perduodama į jį. Tiksliau, ji dar kartą atpažįsta, kad |_+_| srautas nėra prijungtas prie terminalo lango.

Vykdykime scenarijų be vamzdžių ir peradresavimų.

ls

|_+_| srautas yra prijungtas prie terminalo lango, o scenarijus apie tai atitinkamai praneša.

Norėdami patikrinti tą patį su išvesties srautu, mums reikia naujo scenarijaus. Redagavimo priemonėje įveskite toliau pateiktą informaciją ir išsaugokite ją kaip output.sh.

stdout

Naudokite šią komandą, kad ji būtų vykdoma:

stderr

Vienintelis reikšmingas šio scenarijaus pakeitimas yra bandymas laužtiniuose skliaustuose. Mes naudojame skaitmenį 1, kad pavaizduotume failo deskriptorių, skirtą |_+_|.

Išbandykime. Išvestį perkelsime per |_+_|.

stdout

Skelbimas

Scenarijus atpažįsta, kad jo išvestis nepatenka tiesiai į terminalo langą.

Taip pat galime išbandyti scenarijų nukreipdami išvestį į failą.

stdout

Nėra išvesties į terminalo langą, mes tyliai grįžtame į komandų eilutę. Kaip ir tikėjomės.

Galime pažvelgti į capture.txt failą, kad pamatytume, kas buvo užfiksuota. Norėdami tai padaryti, naudokite šią komandą.

stderr

Vėlgi, paprastas mūsų scenarijaus testas nustato, kad |_+_| srautas nesiunčiamas tiesiai į terminalo langą.

Skelbimas

Jei paleidžiame scenarijų be jokių vamzdžių ar peradresavimų, jis turėtų aptikti, kad |_+_| pristatomas tiesiai į terminalo langą.

stdout

Ir būtent tai mes matome.

Sąmonės srautai

Žinodami, kaip nustatyti, ar jūsų scenarijai yra prijungti prie terminalo lango, vamzdžio, ar yra peradresuojami, galite atitinkamai pakoreguoti jų elgesį.

Registravimo ir diagnostikos išvestis gali būti daugiau ar mažiau išsami, priklausomai nuo to, ar ji nukreipiama į ekraną, ar į failą. Klaidų pranešimai gali būti registruojami į kitą failą nei įprasta programos išvestis.

Kaip paprastai, daugiau žinių suteikia daugiau galimybių.

Linux komandos
Failai deguto · pv · katė · tac · chmod · sukibimas · skirt · sed · Su · vyras · pastūmėtas · popd · fsck · testinis diskas · sek · fd · pandoc · CD · $PATH · awk · prisijungti · jq · sulankstyti · unikalus · Journalctl · uodega · valstybė · ls · fstab · išmetė · mažiau · chgrp · chown · rev · žiūrėk · stygos · tipo · pervadinti · užtrauktukas · išpakuokite · kalnas · umount · diegti · fdisk · mkfs · rm · rmdir · rsync · df · gpg · mes · nano · mkdir · · ln · pleistras · Paversti · rclone · susmulkinti · SRM
Procesai slapyvardis · ekranas · viršuje · malonu · renicija · progresas · trasa · sistema · tmux · chsh · istorija · adresu · partija · Laisvas · kurios · dmesg · usermod · ps · chroot · xargs · tty · rausvas · lsof · vmstat · laikas baigėsi · siena · taip · nužudyti · miegoti · sudo · jo · laikas · sugrupuoti · usermod · grupėse · lshw · išjungti · paleisti iš naujo · sustabdyti · išjungti · passwd · lscpu · crontab · data · bg · fg
Tinklo kūrimas netstat · ping · traceroute · ip · ss · Kas yra · fail2ban · bmon · tu · pirštu · nmap · ftp · garbanoti · wget · PSO · kas aš esu · Į · iptables · ssh-keygen · ufw

SUSIJĘS: Geriausi Linux nešiojamieji kompiuteriai kūrėjams ir entuziastams

SKAITYTI KITAS Dave Dave'as McKay'us
Dave'as McKay'us pirmą kartą naudojo kompiuterius, kai buvo madinga perforuoto popieriaus juosta, ir nuo tada jis programuoja. Daugiau nei 30 metų IT pramonėje jis dabar yra visą darbo dieną dirbantis technologijų žurnalistas. Per savo karjerą jis dirbo laisvai samdomu programuotoju, tarptautinės programinės įrangos kūrimo komandos vadovu, IT paslaugų projektų vadovu, o pastaruoju metu – duomenų apsaugos pareigūnu. Jo raštą paskelbė howtogeek.com, cloudsavvyit.com, itenterpriser.com ir opensource.com. Dave'as yra Linux evangelistas ir atvirojo kodo advokatas.
Skaityti visą biografiją

Įdomios Straipsniai