Kas ir stdin, stderr un stdout Bash

What Are Stdin Stderr



Ikreiz, kad terminālī palaižat kādu komandu, stdin , stderr , un stdout ir trīs datu plūsmas, ko rada bash. Ja esat iepazinies ar komandrindu, iespējams, jau esat izmantojis šīs funkcijas. Būtībā tie ļauj pārsūtīt/novirzīt datus no vienas komandas uz citu.

Pārbaudīsim, kā stdin , stderr , un stdout darbojas un kā jūs tos varat izmantot.







stdin, stdout un stderr

Datorā termins straume attiecas uz kaut ko tādu, kas var pārsūtīt datus. Šeit visas trīs plūsmas kā teksts satur tekstu.



Līdzīgi kā ūdens plūsmām, arī datu plūsmām ir divi galapunkti. Ir avots un aizplūde. Neatkarīgi no komandas, kuru izmantojat terminālī, būs jebkurā straumes vietā. Izmantojot straumi, varat savienot divus termināļa logus, divas dažādas komandas un pat failus!



Ātri sadalīsim īpašās plūsmas.





  • stdin: apzīmē standarta ievadi. Tas izmanto tekstu kā ievadi.
  • stdout: apzīmē standarta izvadi. Komandas teksta izvade tiek saglabāta stdout straumē.
  • stderr: apzīmē standarta kļūdu. Ikreiz, kad komandai rodas kļūda, kļūdas ziņojums tiek saglabāts šajā straumē.

Operētājsistēmā Linux gandrīz visas plūsmas tiek uzskatītas par failiem. Tāpat kā jūs varat lasīt/rakstīt failu, jūs varat lasīt/rakstīt datus no šīm straumēm.

Vienkāršs veids, kā piekļūt jebkuram failam, ir ar to saistītā unikālā faila deskriptora numura izmantošana. Šo plūsmu gadījumā katrai no tām ir piešķirtas unikālas vērtības.



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

stdin, stdout un stderr darbībā

Sāksim, uzzinot vairāk par šīm plūsmām, izmantojot darbību, mēs sāksim ar stdin.

Palaidiet šādu komandu.

$lasīt

Komandai būs jāievada tastatūra. Šeit lasīšanas rīks iegūst ieguldījumu no stdin. Tagad apskatīsim stdout.

Vispirms palaidiet komandu.

$ls -viņi

Šeit komanda ls uzskaita pašreizējā direktorijā esošos failus. Saraksts tiek nosūtīts uz stdout un terminālis to izdrukā. Tagad pārbaudīsim stderr.

Ir dažādi veidi, kā var rasties kļūda. Šajā piemērā nederīga argumenta nosūtīšana radīs kļūdu.

$ls -viņijebko

Šeit nav neviena nosaukta faila. Tāpēc tiek nosūtīts ziņojums ls return stderr .

Cauruļvads

Šī ir izplatīta tehnika, kas pilnībā izmanto stdin un stdout straumes priekšrocības. Paskaidrosim to ar piemēru.

$izmest ārā 'Sveika pasaule' | satvēriensSveiki

Lūk, | zīme ir atbildīga par cauruļvadiem. Izvade izmest ārā ģenerē ir rakstīts stdout straume. Pēc tam cauruļvads novirza stdout saturu uz stdin komandai grep. Tieši tā grep zina, ar kādu saturu veikt darbību.

Ja vēlaties pārvietot gan stderr, gan stdout uz nākamo komandu, tad izmantojiet | &.

$izmest ārāSveika pasaule| & kaķis

$jebko| & kaķis

Plūsmu novirzīšana

Tagad mēs zinām, kā šīs straumes darbojas, apskatīsim, kā tās var novirzīt. Cauruļvads ir novirzīšanas veids. Tomēr tas ietver tikai stdin un stdout. Bash ļauj īpaši kontrolēt visas trīs straumes.

Lai novirzītu stdout saturu uz failu, pievienojiet leņķi>, kam seko mērķa faila nosaukums.

$izmest ārāSveika pasaule>hello.txt

Šeit komandas atbalss izvade tiks saglabāta failā hello.txt.

Ja fails jau pastāv, iepriekš minētā komanda to pārrakstīs. Lai no tā izvairītos, pārliecinieties, vai faila nosaukums ir unikāls. Ja nevēlaties pārrakstīt, tā vietā varat izmantot >>. Tas pievieno izvadi mērķa faila beigās.

$izmest ārā 'Sveika pasaule' >>hello.txt

Stdin mērķis ir strādāt ar ieguldījumu. To var arī novirzīt. Piemēram, tā vietā, lai ievadītu ievadi no tastatūras, to var ielādēt no faila.

Šajā komandā kaķis ievadīs informāciju tieši no faila hello.txt.

$kaķis <hello.txt

Apskatīsim novirzīšanu ar citu piemēru. Šoreiz tas ietvers Python skriptu.

$# pyin.py
$ nosaukums= ievadi('Ievadiet vārdu n')
$e -pastu = ievadi('Ievadiet e -pastu n')
$drukāt('Jūsu vārds ir %s un e -pasts ir %s'%(vārds, e -pastu))

Skripta ievade atrodas vietnē hello.txt.

$kaķishello.txt

Nosūtīsim failu kā skripta ievadi.

$ python3 pyin.py <Sveiki.txt

Interesanti, ka jūs varat novirzīt abus stdin un stdout tajā pašā komandrindā. Šeit šī komanda izmantos hello.txt kā stdin un nosūtiet stdout komandu failā.

$ python3 pyin.py <Sveiki.txt >izvade.txt

Stderr novirzīšana ir līdzīga stdout. Tomēr jums ir jāpiemin apraksta ID 2, lai norādītu stderr. Pretējā gadījumā tas izmantos tikai stdout.

Šeit es novirzīšu vietnes saturu stderr uz teksta failu.

$jebko2>error.txt

Stdout un Stderr novirzīšana

Jā, ir iespējams abus novirzīt vienlaikus. Pirms novirzīšanas jums ir jāpiemin apraksta ID 1 un 2.

$izmest ārāSveika pasaule1>output.log2>debug.log

Galīgās domas

stdin , stdout , un stderr ir brīnišķīgas funkcijas bash piedāvā pēc noklusējuma. Ja jums patīk bash skripti, to izmantošana var būt neticami noderīga sarežģītās situācijās.

Vai vēlaties uzzināt vairāk par bash skriptēšanu? Sāksim ar šo iesācēja bash skriptu ceļvedis !

Izbaudi!