Ano ang stdin, stderr at stdout sa Bash

What Are Stdin Stderr



Kailan man magpatakbo ng anumang utos sa terminal, si stdin , stderr , at stdout ay tatlong data stream na lumilikha ng bash. Kung pamilyar ka sa linya ng utos, maaari mo nang samantalahin ang mga tampok na ito. Mahalaga, pinapayagan nila ang piping / pag-redirect ng data mula sa isang utos patungo sa isa pa.

Suriin natin kung paano si stdin , stderr , at stdout gumagana at kung paano mo magagamit din ang mga ito.







stdin, stdout at stderr

Sa computing, ang term stream ay tumutukoy sa isang bagay na maaaring maglipat ng data. Dito, lahat ng tatlong stream ay nagdadala ng teksto bilang data.



Katulad ng mga stream ng tubig, ang mga stream ng data ay mayroon ding dalawang mga endpoint. Mayroong isang mapagkukunan at isang pag-agos. Anumang utos na iyong tumatakbo sa terminal ay magiging sa alinmang punto ng stream. Gamit ang stream, maaari mong ikonekta ang dalawang mga window ng terminal, dalawang magkakaibang mga utos, at kahit na mga file!



Magkaroon tayo ng mabilis na pagkasira ng mga espesyal na stream.





  • stdin: Tumayo para sa karaniwang input. Ito ay tumatagal ng teksto bilang input.
  • stdout: Tumayo para sa karaniwang output. Ang output ng teksto ng isang utos ay nakaimbak sa stdout stream.
  • stderr: Tumayo para sa karaniwang error. Kailan man ang isang utos ay nakaharap sa isang error, ang mensahe ng error ay nakaimbak sa stream na ito.

Sa Linux, halos lahat ng mga stream ay ginagamot na parang mga file. Tulad ng iyong nabasa / nakasulat ng isang file, maaari mong basahin / isulat ang data mula sa mga stream na ito.

Ang isang madaling paraan upang ma-access ang anumang file ay sa pamamagitan ng paggamit ng natatanging numero ng tagapaglarawan ng file na nauugnay dito. Sa kaso ng mga stream na ito, may mga natatanging halaga na nakatalaga sa bawat isa sa kanila.



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

stdin, stdout, at stderr sa aksyon

Magsimula tayo sa pamamagitan ng pag-alam nang higit pa tungkol sa mga stream na ito sa pamamagitan ng pagkilos, magsisimula tayo sa stdin.

Patakbuhin ang sumusunod na utos.

$basahin

Mangangailangan ang utos ng pag-input mula sa keyboard. Dito, nakakakuha ng input ang tool na basahin mula sa stdin. Ngayon tingnan natin ang stdout.

Patakbuhin muna ang utos.

$ls -ang

Dito, nakalista ng utos ng ls ang (mga) file sa kasalukuyang direktoryo. Ipinadala ang listahan sa stdout at inililimbag ito ng terminal. Suriin natin ang stderr ngayon.

Mayroong iba't ibang mga paraan na maaaring mangyari sa isang error. Para sa halimbawang ito, ang pagpapadala ng isang hindi wastong argumento ay magreresulta sa isang error.

$ls -anganumang bagay

Dito, walang file na pinangalanan anuman. Iyon ang dahilan kung bakit ipinadala ang mensahe na ibabalik ng ls stderr .

Piping

Ito ay isang pangkaraniwang diskarteng gumagamit ng buong bentahe ng stdin at stdout stream. Ipaliwanag natin ito sa isang halimbawa.

$itinapon 'hello world' | mahigpit na pagkakahawakKamusta

Narito, ang | responsable para sa piping ang pag-sign. Ang output itinapon bumubuo ay nakasulat sa stdout stream Pagkatapos, ire-redirect ng piping ang nilalaman ng stdout sa stdin para sa utos ng grep. Iyon ang paraan kung paano nalalaman ng grep kung anong nilalaman ang dapat isagawa ang operasyon.

Kung nais mong i-tubo ang parehong stderr at stdout sa susunod na utos, pagkatapos ay gamitin ang | & sa halip.

$itinaponhello mundo| & pusa

$anumang bagay| & pusa

Pag-redirect ng mga stream

Ngayon alam namin kung paano gumagana ang mga stream na ito, tingnan natin kung paano mo ma-redirect ang mga ito. Ang piping ay isang uri ng pag-redirect. Gayunpaman, nagsasangkot lamang ito ng stdin at stdout. Pinapayagan ng Bash ang tiyak na kontrol sa lahat ng tatlong mga stream.

Upang mai-redirect ang nilalaman ng stdout sa isang file, idagdag ang> anggulo na sinusundan ng target na pangalan ng file.

$itinaponhello mundo>hello.txt

Dito, ang output ng utos ng echo ay itatabi sa hello.txt file.

Kung mayroon nang file, pagkatapos ang utos sa itaas ay mai-o-overlap nito. Upang maiwasan ito, tiyakin na ang pangalan ng file ay natatangi. Kung hindi mo nais na patungan, maaaring gusto mong gamitin ang >> sa halip. Ikinakabit nito ang output sa dulo ng target na file.

$itinapon 'hello world' >>hello.txt

Ang layunin ng stdin ay upang gumana sa input. Maaari rin itong i-redirect. Halimbawa, sa halip na i-type ang input mula sa keyboard, maaari itong mai-load mula sa isang file.

Sa utos na ito, direktang kukunin ng pusa ang input nito mula sa hello.txt file.

$pusa <hello.txt

Suriin natin ang pag-redirect gamit ang ibang halimbawa. Sa oras na ito, magsasangkot ito ng isang script ng Python.

$# pyin.py
$ pangalan= input('Ilagay ang pangalan n')
$email = input('Ipasok ang email n')
$mag-print('Ang iyong pangalan ay% s at ang email ay% s'%(pangalan, email))

Ang input para sa script ay matatagpuan sa hello.txt.

$pusahello.txt

Ipadala natin ang file bilang input para sa script.

$ python3 pyin.py <Kamusta.txt

Kapansin-pansin, maaari mong i-redirect ang pareho si stdin at stdout sa parehong linya ng utos. Dito, ang sumusunod na utos ay gagamit ng hello.txt bilang si stdin at ipadala ang stdout ng utos sa isang file.

$ python3 pyin.py <Kamusta.txt >outputtxt

Ang pag-redirect ng stderr ay katulad ng stdout. Gayunpaman, kailangan mong banggitin ang paglalarawan ID 2 para sa nagpapahiwatig ng stderr. Kung hindi man, gagamit lang ito ng stdout.

Dito, ire-redirect ko ang nilalaman ng stderr sa isang text file.

$anumang bagay2>error.txt

Pag-redirect ng Stdout at Stderr

Oo, posible na i-redirect ang pareho sa kanila nang sabay-sabay. Ang kailangan mo lang ay banggitin ang paglalarawan ID 1 at 2 bago ang pag-redirect.

$itinaponhello mundo1>output.log2>debug.log

Pangwakas na saloobin

si stdin , stdout , at stderr ay kahanga-hangang mga tampok bash alok sa pamamagitan ng default. Kung nasa bash scripting ka, ang paggamit ng mga ito ay maaaring maging napakahusay na kapaki-pakinabang sa mga nakakalito na sitwasyon.

Nais bang malaman ang higit pa tungkol sa bash scripting? Magsimula na tayo dito gabay ng nagsisimula sa bash scripting !

Mag-enjoy!