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

Termināļa logs Linux datorā

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āma

Katram 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āma

Mē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

Reklāma

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āma

Jā, 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āma

Ierakstiet šā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.

Reklāma

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

Reklāma

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āma

Ja 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.

Linux komandas
Faili darva · pv · kaķis · tac · chmod · saķere · atšķir · sed · ar · vīrietis · stumts · popd · fsck · testa disks · sek · fd · pandoc · CD · $PATH · awk · pievienoties · jq · salocīt · unik · Journalctl · asti · Valsts · ls · fstab · izmest ārā · mazāk · chgrp · čown · rev · Skaties · stīgas · veids · pārdēvēt · rāvējslēdzējs · izņemiet rāvējslēdzēju · mount · umount · uzstādīt · fdisk · mkfs · rm · rmdir · rsync · df · gpg · mēs · nano · mkdir · no · ln · ielāps · konvertēt · rclone · sasmalcināt · SRM
Procesi aizstājvārds · ekrāns · tops · jauki · Renice · progresu · strace · sistēma · tmux · chsh · vēsture · plkst · partija · bezmaksas · kuras · dmesg · usermod · ps · chroot · xargs · tty · sārti · lsof · vmstat · pārtraukums · siena · · nogalināt · Gulēt · sudo · viņa · laiks · pievienot grupu · usermod · grupas · lshw · izslēgt · pārstartēt · stop · izslēgt · passwd · lscpu · crontab · datums · bg · fg
Tīklošana netstat · ping · traceroute · ip · ss · kurš ir · fail2ban · bmon · tu · pirksts · nmap · ftp · čokurošanās · wget · PVO · kas es esmu · In · iptables · ssh-keygen · ufw

SAISTĪTI: Labākie Linux klēpjdatori izstrādātājiem un entuziastiem

LASĪT TĀLĀK Deiva Makeja profila fotogrāfija Deivs Makejs
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

Interesanti Raksti