Co jsou stdin, stderr a stdout v Bash

What Are Stdin Stderr



Kdykoli v terminálu spustíte jakýkoli příkaz, stdin , stderr , a standardní výstup jsou tři datové toky, které bash vytváří. Pokud jste obeznámeni s příkazovým řádkem, možná jste již těchto funkcí využili. V zásadě umožňují propojení/přesměrování dat z jednoho příkazu na druhý.

Podívejme se, jak stdin , stderr , a standardní výstup funguje a jak je můžete také použít.







stdin, stdout a stderr

V oblasti výpočetní techniky termín stream označuje něco, co může přenášet data. Zde všechny tři streamy nesou text jako data.



Datové toky mají podobně jako vodní toky také dva koncové body. Existuje zdroj a odliv. Jakýkoli příkaz, který v terminálu spustíte, bude v kterémkoli bodě streamu. Pomocí streamu můžete propojit dvě okna terminálu, dva různé příkazy a dokonce i soubory!



Pojďme si rychle rozebrat speciální streamy.





  • stdin: Znamená standardní vstup. Jako vstup vyžaduje text.
  • stdout: Znamená standardní výstup. Textový výstup příkazu je uložen ve stdout streamu.
  • stderr: Znamená standardní chybu. Kdykoli příkaz narazí na chybu, chybová zpráva je uložena v tomto streamu.

V Linuxu jsou téměř se všemi toky zacházeno, jako by to byly soubory. Stejně jako můžete číst/zapisovat soubory, můžete z těchto streamů číst/zapisovat data.

Snadný přístup k jakémukoli souboru je pomocí jedinečného čísla popisovače souboru, které je k němu přidruženo. V případě těchto proudů jsou každému z nich přiřazeny jedinečné hodnoty.



  • 0: stdin
  • 1: standardní výstup
  • 2: stderr

stdin, stdout a stderr v akci

Začněme tím, že se prostřednictvím těchto akcí dozvíme více o těchto proudech, začneme stdin.

Spusťte následující příkaz.

$číst

Příkaz bude vyžadovat zadání z klávesnice. Zde čtecí nástroj získává vstup ze stdin. Nyní se podívejme na standardní výstup.

Nejprve spusťte příkaz.

$ls -ten

Zde příkaz ls zobrazí seznam souborů v aktuálním adresáři. Seznam je odeslán do standardní výstup a terminál to vytiskne. Podívejme se nyní na stderr.

K chybě může dojít různými způsoby. V tomto případě odeslání neplatného argumentu ls způsobí chybu.

$ls -tencokoliv

Zde neexistuje žádný soubor, který by něco pojmenoval. Proto je odeslána zpráva ls returns stderr .

Potrubí

Toto je běžná technika, která plně využívá stdy a stdout streamy. Vysvětlíme si to na příkladu.

$vyhodil 'Ahoj světe' | rukojeťAhoj

Tady | značka je zodpovědná za potrubí. Výstup vyhodil generuje je napsáno v souboru standardní výstup proud. Potom potrubí přesměruje obsah stdout na stdin pro příkaz grep. Díky tomu grep ví, na jakém obsahu má operaci provést.

Pokud chcete přesunout stderr i stdout na další příkaz, použijte místo toho | &.

$vyhodilAhoj světe| & kočka

$cokoliv| & kočka

Přesměrování streamů

Nyní víme, jak tyto streamy fungují, pojďme se podívat na to, jak je můžete přesměrovat. Potrubí je forma přesměrování. Zahrnuje však pouze stdin a stdout. Bash umožňuje specifickou kontrolu nad všemi třemi streamy.

Chcete -li přesměrovat obsah stdout do souboru, přidejte úhel> následovaný názvem cílového souboru.

$vyhodilAhoj světe>ahoj.txt

Zde bude výstup příkazu echo uložen do souboru hello.txt.

Pokud soubor již existuje, přepíše jej výše uvedený příkaz. Abyste tomu zabránili, ujistěte se, že název souboru je jedinečný. Pokud nechcete přepisovat, můžete místo toho použít >>. Připojí výstup na konec cílového souboru.

$vyhodil 'Ahoj světe' >>ahoj.txt

Cílem stdin je pracovat se vstupy. To lze také přesměrovat. Například místo psaní vstupu z klávesnice jej lze načíst ze souboru.

V tomto příkazu převezme kočka svůj vstup přímo ze souboru hello.txt.

$kočka <ahoj.txt

Podívejme se na přesměrování na jiném příkladu. Tentokrát to bude zahrnovat skript Pythonu.

$# pyin.py
$ jméno= vstup('Napište jméno n')
$e-mailem = vstup('Zadejte email n')
$tisk('Vaše jméno je %s a e -mail je %s'%(název, e-mailem))

Vstup pro skript je umístěn na hello.txt.

$kočkaahoj.txt

Pošleme soubor jako vstup pro skript.

$ python3 pyin.py <Ahoj.txt

Zajímavé je, že můžete přesměrovat obojí stdin a standardní výstup na stejném příkazovém řádku. Zde následující příkaz použije hello.txt jako stdin a odešlete standardní výstup příkazu do souboru.

$ python3 pyin.py <Ahoj.txt >výstup.txt

Přesměrování stderr je podobné jako stdout. Musíte však uvést popis ID 2 pro označení stderr. V opačném případě použije pouze standardní výstup.

Zde přesměruji obsah stderr do textového souboru.

$cokoliv2>error.txt

Přesměrování Stdout a Stderr

Ano, je možné je přesměrovat současně. Vše, co potřebujete, je zmínit popis ID 1 a 2 před přesměrováním.

$vyhodilAhoj světe1>výstup.log2>debug.log

Závěrečné myšlenky

stdin , standardní výstup , a stderr jsou skvělé funkce, které bash ve výchozím nastavení nabízí. Pokud vás baví skriptování bash, jejich použití může být neuvěřitelně užitečné ve složitých situacích.

Chcete se dozvědět více o bash skriptování? Začněme s tím příručka pro začátečníky ke skriptování bash !

Užívat si!