Kas ir stdin, stdout un stderr operētājsistēmā Linux?

Fatmawati Achmad Zaenuri/Shutterstock.com
|_+_|, |_+_| un |_+_| ir trīs datu straumes, kas izveidotas, palaižot Linux komandu. Varat tos izmantot, lai noteiktu, vai jūsu skripti tiek nosūtīti vai novirzīti. Mēs parādīsim, kā.
Straumes savieno divus punktus
Tiklīdz sākat mācīties par Linux un Unix līdzīgām operētājsistēmām, jūs saskarsities ar terminiem |_+_|, |_+_| un |_+_|. Šie ir trīs standarta straumes kas tiek izveidoti, izpildot Linux komandu. Datorā straume ir kaut kas tāds, kas var pārsūtīt datus. Šo straumju gadījumā šie dati ir teksts.
Datu plūsmām, tāpat kā ūdens plūsmām, ir divi gali. Viņiem ir avots un aizplūšana. Neatkarīgi no tā, kura Linux komanda jūs izmantojat, katrai straumei ir viens gals. Otru galu nosaka apvalks, kas palaida komandu. Šis gals tiks savienots ar termināļa logu, savienots ar cauruli vai novirzīts uz failu vai citu komandu atbilstoši komandrindai, ar kuru tika palaists komanda.
Linux standarta straumes
Operētājsistēmā Linux |_+_| ir standarta ievades straume. Tas pieņem tekstu kā ievadi. Teksta izvade no komandas uz čaulu tiek piegādāta, izmantojot |_+_| (standarta izejas) straume. Kļūdu ziņojumi no komandas tiek nosūtīti, izmantojot |_+_| (standarta kļūda) straume.
Tātad jūs varat redzēt, ka ir divas izvades straumes, |_+_| un |_+_|, un viena ievades straume, |_+_|. Tā kā kļūdu ziņojumiem un parastajai izvadei katram ir savs kanāls to pārnešanai uz termināļa logu, tos var apstrādāt neatkarīgi vienu no otra.
Straumes tiek apstrādātas kā faili
Straumes operētājsistēmā Linux — tāpat kā gandrīz viss pārējais — tiek uzskatītas par failiem. Jūs varat lasīt tekstu no faila un varat ierakstīt tekstu failā. Abas šīs darbības ietver datu plūsmu. Tāpēc datu straumes kā faila apstrāde nav tik sarežģīta.
ReklāmaKatram ar procesu saistītajam failam tiek piešķirts unikāls numurs, lai to identificētu. Tas ir pazīstams kā faila deskriptors. Ikreiz, kad ar failu ir jāveic darbība, faila deskriptors tiek izmantots faila identificēšanai.
Šīs vērtības vienmēr tiek izmantotas |_+_|, |_+_| un |_+_|:
- 0 : stdin
- viens : stdout
- divi : stderr
Reaģēšana uz caurulēm un novirzīšanu
Lai atvieglotu kādas personas ievadu priekšmetā, izplatīts paņēmiens ir mācīt tēmas vienkāršotu versiju. Piemēram, ar gramatiku mums saka, ka noteikums ir I pirms E, izņemot pēc C. Bet patiesībā tur ir vairāk izņēmumu no šī noteikuma nekā ir gadījumi, kas tam pakļaujas.
Līdzīgi, runājot par |_+_|, |_+_| un |_+_| ir ērti formulēt pieņemto aksiomu, ka process nezina, nedz neinteresē, kur tiek pārtrauktas tā trīs standarta plūsmas. Vai procesam ir jārūpējas par to, vai tā izvade tiek nosūtīta uz termināli vai tiek novirzīta uz failu? Vai tas pat var noteikt, vai tā ievade nāk no tastatūras vai tiek ievadīta no cita procesa?
Faktiski process zina vai vismaz var uzzināt, ja tas izvēlas pārbaudīt, un tas var attiecīgi mainīt savu darbību, ja programmatūras autors ir nolēmis pievienot šo funkcionalitāti.
ReklāmaMēs ļoti viegli varam redzēt šīs izmaiņas uzvedībā. Izmēģiniet šīs divas komandas:
stdin
stdout
|_+_| komanda darbojas citādi, ja tās izvade (|_+_|) tiek ievadīta citā komandā. Tas ir |_+_| kas pārslēdzas uz vienas kolonnas izvadi, tas nav reklāmguvums, ko veic |_+_|. Un |_+_| dara to pašu, ja tā izvade tiek novirzīta:
stderr
stdin
Stdout un stderr novirzīšana
Ir priekšrocības, ja kļūdu ziņojumi tiek piegādāti, izmantojot īpašu straumi. Tas nozīmē, ka mēs varam novirzīt komandas izvadi (|_+_|) uz failu un joprojām redzēt visus kļūdu ziņojumus (|_+_|) termināļa logā. Ja nepieciešams, varat reaģēt uz kļūdām, tiklīdz tās rodas. Tas arī neļauj kļūdu ziņojumiem piesārņot failu, kas |_+_| ir novirzīts uz.
Ierakstiet šo tekstu redaktorā un saglabājiet to failā error.sh.
stdout
Padariet skriptu izpildāmu ar šo komandu:
stederr
Pirmā skripta rinda atbalso tekstu termināļa logā, izmantojot |_+_| straume. Otrajā rindā tiek mēģināts piekļūt failam, kas neeksistē. Tas ģenerēs kļūdas ziņojumu, kas tiks piegādāts, izmantojot |_+_|.
Palaidiet skriptu ar šo komandu:
stdin
Mēs redzam, ka abas izvades plūsmas |_+_| un |_+_|, ir parādīti termināļa logos.
Mēģināsim novirzīt izvadi uz failu:
stdout
Kļūdas ziņojums, kas tiek piegādāts, izmantojot |_+_| joprojām tiek nosūtīts uz termināļa logu. Mēs varam pārbaudīt faila saturu, lai redzētu, vai |_+_| izvade nonāca failā.
stderr
Izvade no |_+_| tika novirzīts uz failu, kā paredzēts.
|_+_| novirzīšanas simbols darbojas ar |_+_| pēc noklusējuma. Varat izmantot vienu no ciparu faila deskriptoriem, lai norādītu, kuru standarta izvades straumi vēlaties novirzīt.
Lai nepārprotami novirzītu |_+_|, izmantojiet šo novirzīšanas instrukciju:
stdout
Lai nepārprotami novirzītu |_+_|, izmantojiet šo novirzīšanas instrukciju:
stderr
Mēģināsim vēlreiz pārbaudīt, un šoreiz izmantosim |_+_|:
stdin
Kļūdas ziņojums tiek novirzīts un |_+_| |_+_| ziņojums tiek nosūtīts uz termināļa logu:
Apskatīsim, kas atrodas failā capture.txt.
stdin
|_+_| ziņojums ir failā capture.txt, kā paredzēts.
Novirzīšana gan stdout, gan stderr
Protams, ja mēs varam novirzīt vai nu |_+_| vai |_+_| uz failu neatkarīgi vienam no otra, mums vajadzētu būt iespējai tos abus vienlaikus novirzīt uz diviem dažādiem failiem?
ReklāmaJā, mēs varam. Šī komanda novirzīs |_+_| uz failu ar nosaukumu capture.txt un |_+_| uz failu ar nosaukumu error.txt.
stdout,
Tā kā abas izvades plūsmas — standarta izvade un standarta kļūda — tiek novirzītas uz failiem, termināļa logā nav redzama izvade. Mēs tiekam atgriezti komandrindas uzvednē, it kā nekas nebūtu noticis.
Pārbaudīsim katra faila saturu:
stderr
stdin
Failu stdout un stderr novirzīšana uz to pašu failu
Tas ir labi, katra standarta izvades straume tiek novirzīta uz savu īpašo failu. Vienīgā cita kombinācija, ko varam darīt, ir nosūtīt abus |_+_| un |_+_| uz to pašu failu.
Mēs to varam sasniegt ar šādu komandu:
stdout
Sadalīsim to.
- ./error.sh : palaiž skripta failu error.sh.
- > Capture.txt : novirza |_+_| straumē uz Capture.txt failu. |_+_| ir saīsinājums vārdam |_+_|.
- 2> un 1 : tiek izmantota &> novirzīšanas instrukcija. Šī instrukcija ļauj norādīt apvalkam, lai viena straume nonāktu tajā pašā galamērķī, kur cita straume. Šajā gadījumā mēs sakām, ka 2. straume |_+_| tiek novirzīta uz to pašu galamērķi, uz kuru tiek novirzīta 1. straume |_+_|.
Nav redzama izvade. Tas ir iepriecinoši.
Pārbaudīsim failu capture.txt un redzēsim, kas tajā atrodas.
stderr
Gan |_+_| un |_+_| straumes ir novirzītas uz vienu mērķa failu.
Lai straumes izvade tiktu novirzīta un klusi izmesta, novirziet izvadi uz |_+_|.
Novirzīšanas noteikšana skripta ietvaros
Mēs apspriedām, kā komanda var noteikt, vai kāda no straumēm tiek novirzīta, un var izvēlēties attiecīgi mainīt tās darbību. Vai mēs varam to paveikt mūsu pašu skriptos? Jā, mēs varam. Un tas ir ļoti viegli saprotams un lietojams paņēmiens.
ReklāmaIerakstiet šādu tekstu redaktorā un saglabājiet to kā input.sh.
ls
Izmantojiet šo komandu, lai padarītu to izpildāmu:
stdout
Gudrākā daļa ir pārbaudi kvadrātiekavās . |_+_| Opcija (termināls) atgriež patiesu (0), ja fails ir saistīts ar faila deskriptoru beidzas termināļa logā . Mēs esam izmantojuši faila deskriptoru 0 kā testa argumentu, kas apzīmē |_+_|.
Ja |_+_| ir savienots ar termināļa logu, pārbaude izrādīsies patiesa. Ja |_+_| ir savienots ar failu vai cauruli, pārbaude neizdosies.
Mēs varam izmantot jebkuru ērtu teksta failu, lai ģenerētu ievadi skriptā. Šeit mēs izmantojam vienu ar nosaukumu dummy.txt.
ls
Izvade parāda, ka skripts atpazīst, ka ievade nenāk no tastatūras, bet gan no faila. Ja izvēlaties, varat attiecīgi mainīt sava skripta darbību.
Tas bija ar faila novirzīšanu, izmēģināsim to ar cauruli.
cat
Skripts atpazīst, ka tā ievade tiek ievadīta tajā. Precīzāk, tas vēlreiz atzīst, ka |_+_| straume nav savienota ar termināļa logu.
Izpildīsim skriptu, neizmantojot ne cauruļvadus, ne novirzīšanu.
ls
|_+_| straume ir savienota ar termināļa logu, un skripts par to attiecīgi ziņo.
Lai pārbaudītu to pašu ar izvades straumi, mums ir nepieciešams jauns skripts. Ierakstiet šo redaktorā un saglabājiet to kā output.sh.
stdout
Izmantojiet šo komandu, lai padarītu to izpildāmu:
stderr
Vienīgās būtiskās izmaiņas šajā skriptā ir testā kvadrātiekavās. Mēs izmantojam ciparu 1, lai attēlotu faila deskriptoru |_+_|.
Izmēģināsim. Izvade tiks nosūtīta caur |_+_|.
stdout
Skripts atzīst, ka tā izvade nenonāk tieši termināļa logā.
Mēs varam arī pārbaudīt skriptu, novirzot izvadi uz failu.
stdout
Termināļa logā nav izvades, mēs klusi tiekam atgriezti komandu uzvednē. Kā mēs to gaidījām.
Mēs varam ieskatīties failā capture.txt, lai redzētu, kas tika uzņemts. Lai to izdarītu, izmantojiet šo komandu.
stderr
Atkal, vienkāršais tests mūsu skriptā nosaka, ka |_+_| straume netiek sūtīta tieši uz termināļa logu.
ReklāmaJa mēs palaižam skriptu bez jebkādām caurulēm vai novirzīšanas, tam vajadzētu noteikt |_+_| tiek piegādāts tieši uz termināļa logu.
stdout
Un tieši to mēs redzam.
Apziņas straumes
Zinot, kā noteikt, vai jūsu skripti ir savienoti ar termināļa logu, cauruli vai tiek novirzīti, ļauj attiecīgi pielāgot to darbību.
Reģistrācijas un diagnostikas izvade var būt vairāk vai mazāk detalizēta atkarībā no tā, vai tā tiek novirzīta uz ekrānu vai failu. Kļūdu ziņojumi var tikt reģistrēti citā failā, nevis parastajā programmas izvadē.
Kā parasti, vairāk zināšanu sniedz vairāk iespēju.
SAISTĪTI: Labākie Linux klēpjdatori izstrādātājiem un entuziastiem
LASĪT TĀLĀK- & rsaquo; Kā lietot un pakešu operētājsistēmā Linux, lai ieplānotu komandas
- & rsaquo; Komandrindas: kāpēc cilvēki joprojām uztraucas ar tām?
- & rsaquo; Kā izmantot Echo komandu operētājsistēmā Linux
- & rsaquo; Kā izveidot cilvēka lapu operētājsistēmā Linux
- & rsaquo; Kā apstrādāt failu rindu pa rindiņai Linux Bash skriptā
- & rsaquo; 15 īpašie varoņi, kas jums jāzina par Bašu
- › Kā atrast savu Spotify iesaiņojumu 2021. gadam
- & rsaquo; Kiberpirmdiena 2021: labākie tehnoloģiju piedāvājumi

Deivs Makejs pirmo reizi izmantoja datorus, kad modē bija perforētā papīra lente, un kopš tā laika viņš nodarbojas ar programmēšanu. Pēc vairāk nekā 30 IT nozarē nostrādātiem gadiem viņš tagad ir pilnas slodzes tehnoloģiju žurnālists. Savas karjeras laikā viņš ir strādājis par ārštata programmētāju, starptautiskas programmatūras izstrādes komandas vadītāju, IT pakalpojumu projektu vadītāju un pēdējā laikā par datu aizsardzības speciālistu. Viņa raksti ir publicēti vietnē howtogeek.com, cloudsavvyit.com, itenterpriser.com un opensource.com. Deivs ir Linux evaņģēlists un atvērtā koda aizstāvis.
Lasīt pilnu biogrāfiju