Preverimo, kako stdin , stderr , in stdout deluje in kako jih lahko tudi uporabljate.
stdin, stdout in stderr
V računalništvu se izraz tok nanaša na nekaj, kar lahko prenaša podatke. Tu vsi trije tokovi nosijo besedilo kot podatke.
Podobno kot vodni tokovi imajo tudi podatkovni tokovi dve končni točki. Obstajata vir in odtok. Ne glede na ukaz, ki ga izvajate v terminalu, bo na kateri koli točki toka. S tokom lahko povežete dve terminalski okni, dva različna ukaza in celo datoteke!
Na hitro razčlenimo posebne tokove.
- stdin: Stoji za standardni vnos. Besedilo vzame kot vnos.
- stdout: Označuje standardni izhod. Besedilni izpis ukaza je shranjen v toku stdout.
- stderr: Označuje standardno napako. Kadar koli se ukaz sooči z napako, se sporočilo o napaki shrani v ta tok.
V Linuxu se skoraj vsi tokovi obravnavajo kot datoteke. Tako kot lahko berete/pišete datoteko, lahko tudi berete/pišete podatke iz teh tokov.
Do katere koli datoteke lahko preprosto dostopate z uporabo edinstvene številke deskriptorja datoteke, ki je z njo povezana. V primeru teh tokov so vsakemu dodeljene edinstvene vrednosti.
- 0: stdin
- 1: stdout
- 2: stderr
stdin, stdout in stderr v akciji
Začnimo z učenjem več o teh tokovih z dejanji, začeli bomo s stdin.
Zaženite naslednji ukaz.
$prebrati
Ukaz bo zahteval vnos s tipkovnice. Tukaj orodje za branje pridobiva vnos iz stdin. Zdaj pa poglejmo stdout.
Najprej zaženite ukaz.
$ls -
Tu ukaz ls navaja datoteke v trenutnem imeniku. Seznam je poslan na stdout in terminal ga natisne. Zdaj preverimo stderr.
Napaka se lahko pojavi na različne načine. V tem primeru bo pošiljanje neveljavnega argumenta povzročilo napako.
$ls -karkoli
Tukaj ni datoteke z imenom nič. Zato je poslano sporočilo ls Returns stderr .
Cevovodi
To je običajna tehnika, ki v celoti izkorišča tokove stdin in stdout. Razložimo to s primerom.
$vrgel ven 'Pozdravljen, svet' | oprijemzdravo
Tukaj je | znak je odgovoren za cevovode. Izhod vrgel ven generira je zapisano v stdout tok. Nato cevovod preusmeri vsebino stdout na stdin za ukaz grep. Tako grep ve, na kateri vsebini naj izvede operacijo.
Če želite tako stderr kot stdout prenesti v naslednji ukaz, uporabite namesto njih & &.
$vrgel venPozdravljen, svet| & mačka$karkoli| & mačka
Preusmerjanje tokov
Zdaj vemo, kako ti tokovi delujejo, poglejmo, kako jih lahko preusmerite. Cevovodi so oblika preusmeritve. Vendar pa vključuje le stdin in stdout. Bash omogoča poseben nadzor nad vsemi tremi tokovi.
Če želite vsebino stdout preusmeriti v datoteko, dodajte> kot in ime ciljne datoteke.
$vrgel venPozdravljen, svet>hello.txt
Tu bo izhod ukaza echo shranjen v datoteki hello.txt.
Če datoteka že obstaja, jo bo zgornji ukaz prepisal. Da bi se temu izognili, se prepričajte, da je ime datoteke edinstveno. Če ne želite prepisati, namesto tega uporabite >>. Doda izhod na koncu ciljne datoteke.
$vrgel ven 'Pozdravljen, svet' >>hello.txt
Cilj stdin je delo z vhodnimi podatki. To je mogoče tudi preusmeriti. Na primer, namesto da vnesete vnos s tipkovnice, ga lahko naložite iz datoteke.
V tem ukazu bo mačka vnesla podatke neposredno iz datoteke hello.txt.
$mačka <hello.txt
Preverimo preusmeritev z drugim primerom. Tokrat bo vključeval skript Python.
$# pyin.py$ name= vnos('Vnesite ime n')
$E-naslov = vnos('Vnesite e -pošto n')
$tiskanje('Vaše ime je %s in e -poštni naslov je %s'%(ime, E-naslov))
Vnos za skript se nahaja na hello.txt.
$mačkahello.txt
Pošljimo datoteko kot vhod za skript.
$ python3 pyin.py <zdravo.txt
Zanimivo je, da lahko oboje preusmerite stdin in stdout v isti ukazni vrstici. Tukaj bo naslednji ukaz uporabil hello.txt kot stdin in pošljite stdout ukaza za datoteko.
$ python3 pyin.py <zdravo.txt >izhod.txt
Preusmeritev stderr je podobna stdout. Za označbo stderr pa morate omeniti ID opisa 2. V nasprotnem primeru bo uporabil samo stdout.
Tukaj bom preusmeril vsebino stderr v besedilno datoteko.
$karkoli2>error.txt
Preusmeritev Stdout in Stderr
Da, oboje je mogoče preusmeriti hkrati. Vse, kar potrebujete, je, da pred preusmeritvijo navedete ID opisa 1 in 2.
$vrgel venPozdravljen, svet1>output.log2>debug.log
Končne misli
stdin , stdout , in stderr so čudovite lastnosti, ki jih bash privzeto ponuja. Če se ukvarjate z bash skriptiranjem, je njihova uporaba lahko zelo uporabna v zapletenih situacijah.
Želite izvedeti več o bash skriptiranju? Začnimo s tem vodnik za začetnike pri bash skriptiranju !
Uživajte!