Kas yra „stdin“, „stdout“ ir „stderr“ sistemoje „Linux“?
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.
SkelbimasKiekvienam 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?
SkelbimasTaip, 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ą.
SkelbimasJei 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ų.
SUSIJĘS: Geriausi Linux nešiojamieji kompiuteriai kūrėjams ir entuziastams
SKAITYTI KITAS- & rsaquo; Kaip naudoti „Linux“ ir suplanuoti komandas
- & rsaquo; Komandinės eilutės: kodėl žmonės vis dar nerimauja su jomis?
- & rsaquo; Kaip naudoti „Echo“ komandą „Linux“.
- & rsaquo; Kaip sukurti „Man“ puslapį „Linux“.
- & rsaquo; Kaip apdoroti failą eilute po eilutės „Linux Bash“ scenarijuje
- & rsaquo; 15 ypatingų personažų, kuriuos reikia žinoti apie Bash
- › Kaip rasti „Spotify“ supakuotą 2021 m
- & rsaquo; 2021 m. kibernetinis pirmadienis: geriausi techniniai pasiūlymai
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ą