Čo sú to stdin, stderr a stdout v Bash

What Are Stdin Stderr



Kedykoľvek spustíte na termináli akýkoľvek príkaz, stdin , stderr a stdout sú tri toky údajov, ktoré bash vytvára. Ak poznáte príkazový riadok, možno ste už tieto funkcie využili. V zásade umožňujú prepojenie/presmerovanie údajov z jedného príkazu na druhý.

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!