Pozrime sa, ako stdin , stderr a stdout funguje a ako ich môžete tiež použiť.
stdin, stdout a stderr
V oblasti výpočtovej techniky pojem prúd označuje niečo, čo môže prenášať údaje. Tu všetky tri streamy nesú text ako údaje.
Podobne ako vodné toky, aj dátové toky majú dva koncové body. Existuje zdroj a odliv. Akýkoľvek príkaz, ktorý spustíte v termináli, bude v každom bode streamu. Pomocou streamu môžete prepojiť dve okná terminálu, dva rôzne príkazy a dokonca aj súbory!
Poďme si rýchlo rozobrať špeciálne streamy.
- stdin: Znamená štandardný vstup. Na vstup je potrebný text.
- stdout: Znamená štandardný výstup. Textový výstup príkazu je uložený v stdout streame.
- stderr: Označuje štandardnú chybu. Kedykoľvek príkazu dôjde k chybe, chybové hlásenie sa uloží do tohto streamu.
V systéme Linux sú takmer všetky toky považované za súbory. Rovnako ako môžete čítať/zapisovať súbory, môžete z týchto prúdov čítať/zapisovať údaje.
Jednoduchý prístup k akémukoľvek súboru je pomocou jedinečného čísla deskriptora súboru, ktoré je k nemu priradené. V prípade týchto prúdov sú každému z nich priradené jedinečné hodnoty.
- 0: stdin
- 1: výstup
- 2: stderr
stdin, stdout a stderr v akcii
Začnime tým, že sa prostredníctvom akcie dozvedáme viac o týchto prúdoch, začneme so stdin.
Spustite nasledujúci príkaz.
$čítať
Príkaz bude vyžadovať zadanie z klávesnice. Tu čítací nástroj získava vstup od stdin. Teraz sa pozrime na výstup.
Najprv spustite príkaz.
$ls -ten
Tu príkaz ls zobrazí zoznam súborov v aktuálnom adresári. Zoznam sa odošle na adresu stdout a terminál ho vytlačí. Teraz skontrolujeme stderr.
K chybe môže dôjsť rôznymi spôsobmi. V tomto prípade spôsobí odoslanie neplatného argumentu chybu.
$ls -tenčokoľvek
Tu neexistuje žiadny súbor s názvom čokoľvek. Preto je odoslaná správa ls returns stderr .
Potrubie
Ide o bežnú techniku, ktorá naplno využíva prúdy stdin a stdout. Vysvetlíme to na príklade.
$zahodil 'ahoj svet' | uchopenieAhoj
Tu | značka je zodpovedná za potrubie. Výstup zahodil generuje je napísané v súbore stdout Prúd. Potom potrubie presmeruje obsah stdout na stdin pre príkaz grep. Vďaka tomu grep vie, na akom obsahu má vykonať operáciu.
Ak chcete prepojiť stderr aj stdout na nasledujúci príkaz, použite namiesto toho | &.
$zahodilahoj svet| & kat$čokoľvek| & kat
Presmerovanie streamov
Teraz vieme, ako tieto streamy fungujú, pozrime sa na to, ako ich môžete presmerovať. Potrubie je forma presmerovania. Zahŕňa však iba výstupy a výstupy. Bash umožňuje konkrétnu kontrolu nad všetkými tromi streammi.
Ak chcete presmerovať obsah stdout do súboru, pridajte> uhol, za ktorým nasleduje názov cieľového súboru.
$zahodilahoj svet>ahoj.txt
Tu bude výstup príkazu echo uložený v súbore hello.txt.
Ak súbor už existuje, vyššie uvedený príkaz ho prepíše. Aby ste tomu zabránili, uistite sa, že názov súboru je jedinečný. Ak nechcete prepísať, môžete namiesto toho použiť >>. Pripojí výstup na koniec cieľového súboru.
$zahodil 'ahoj svet' >>ahoj.txt
Cieľom stdin je pracovať so vstupom. Toto je možné tiež presmerovať. Napríklad namiesto zadávania textu z klávesnice ho možno načítať zo súboru.
V tomto príkaze mačka prevezme vstup priamo zo súboru hello.txt.
$kat <ahoj.txt
Pozrime sa na presmerovanie na inom príklade. Dnes to bude zahŕňať skript Python.
$# pyin.py$ meno= vstup('Zadaj meno n')
$e -mail = vstup('Zadajte e -mail n')
$vytlačiť('Vaše meno je %s a e -mail je %s'%(názov, e -mail))
Vstup pre skript sa nachádza na adrese hello.txt.
$katahoj.txt
Pošlime súbor ako vstup pre skript.
$ python3 pyin.py <Ahoj.TXT
Je zaujímavé, že obe môžete presmerovať stdin a stdout v rovnakom príkazovom riadku. Tu nasledujúci príkaz použije hello.txt ako stdin a odošlite stdout príkazu do súboru.
$ python3 pyin.py <Ahoj.TXT >výkon.TXT
Presmerovanie stderr je podobné ako stdout. Musíte však uviesť popis ID 2 na označenie stderr. V opačnom prípade použije iba výstup.
Tu presmerujem obsah stderr do textového súboru.
$čokoľvek2>error.txt
Presmerovanie Stdout a Stderr
Áno, je možné ich presmerovať súčasne. Všetko, čo potrebujete, je spomenúť popis ID 1 a 2 pred presmerovaním.
$zahodilahoj svet1>výstup.log2>debug.log
Záverečné myšlienky
stdin , stdout a stderr sú úžasné funkcie, ktoré bash štandardne ponúka. Ak vás baví skriptovanie bash, ich použitie môže byť v zložitých situáciách veľmi užitočné.
Chcete sa dozvedieť viac o bash skriptovaní? Začnime s tým príručka pre začiatočníkov k skriptovaniu bash !
Užite si to!