Mi a stdin, a stderr és a stdout a Bash -ben

What Are Stdin Stderr



Amikor parancsot futtat a terminálon, stdin , stderr , és stdout három adatfolyam, amelyet a bash hoz létre. Ha ismeri a parancssort, akkor lehet, hogy már kihasználta ezeket a funkciókat. Lényegében lehetővé teszik az adatok átvezetését/átirányítását egyik parancsból a másikba.

Nézzük meg, hogyan stdin , stderr , és stdout működik, és hogyan használhatja őket.







stdin, stdout és stderr

A számítástechnikában a stream kifejezés valami olyanra utal, amely képes adatokat továbbítani. Itt mindhárom adatfolyam szövegként szöveget hordoz.



A vízfolyásokhoz hasonlóan az adatfolyamoknak is két végpontjuk van. Van forrás és kiáramlás. Bármilyen parancsot is futtat a terminálon, az az adatfolyam bármelyik pontján lesz. A folyam segítségével két terminálablakot, két különböző parancsot és akár fájlokat is csatlakoztathat!



Gyorsan bontsuk le a speciális folyamokat.





  • stdin: Szabványos bemenet. Szöveget használ bemenetként.
  • stdout: Standard kimenetet jelent. A parancs szövegkimenete az stdout adatfolyamban tárolódik.
  • stderr: Szabványos hiba. Amikor egy parancs hibával szembesül, a hibaüzenet ebben a folyamban tárolódik.

Linux alatt szinte az összes adatfolyamot fájlként kezelik. Ahogy olvasni/írni egy fájlt, úgy olvashat/írhat adatokat ezekből a folyamokból.

Bármely fájl elérésének egyszerű módja a hozzá tartozó egyedi fájlleíró szám használata. Ezen folyamok esetében mindegyikhez egyedi értékek vannak hozzárendelve.



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

stdin, stdout és stderr akcióban

Kezdjük azzal, hogy cselekvéssel többet megtudunk ezekről a folyamokról, kezdjük a stdin -vel.

Futtassa a következő parancsot.

$olvas

A parancs beírását a billentyűzetről kell elvégezni. Itt az olvasó eszköz az stdin -től kapja meg a bemenetet. Most nézzük az stdout -ot.

Először futtassa a parancsot.

$ls -az

Itt az ls parancs felsorolja a fájlokat az aktuális könyvtárban. A listát elküldik a címre stdout és a terminál kinyomtatja. Ellenőrizzük most a stderr -t.

Különféle módon fordulhat elő hiba. Ebben a példában az ls érvénytelen argumentum elküldése hibát eredményez.

$ls -azbármi

Itt nincs semmilyen nevű fájl. Ezért a ls return üzenetet küldjük stderr .

Csővezeték

Ez egy gyakori technika, amely teljes mértékben kihasználja az stdin és stdout folyamok előnyeit. Magyarázzuk meg egy példával.

$kidobta 'Helló Világ' | markolatHelló

Itt a | jel felelős a csővezetékekért. A kimenet kidobta generál, a stdout folyam. Ezután a csővezeték átirányítja az stdout tartalmát az stdin -re a grep parancshoz. A grep így tudja, hogy milyen tartalommal kell végrehajtani a műveletet.

Ha az stderrt és az stdout -ot is a következő parancsra szeretné irányítani, akkor használja a |

$kidobtaHelló Világ| & macska

$bármi| & macska

Folyamatok átirányítása

Most már tudjuk, hogyan működnek ezek a folyamok, nézzük meg, hogyan irányíthatja át őket. A csővezeték az átirányítás egyik formája. Ez azonban csak stdin és stdout. A Bash lehetővé teszi a három adatfolyam specifikus szabályozását.

Az stdout tartalom fájlba való átirányításához adja hozzá a> szöget, majd a célfájl nevét.

$kidobtaHelló Világ>hello.txt

Itt az echo parancs kimenete a hello.txt fájlban lesz tárolva.

Ha a fájl már létezett, akkor a fenti parancs felülírja. Ennek elkerülése érdekében győződjön meg arról, hogy a fájl neve egyedi. Ha nem szeretné felülírni, akkor a >> lehetőséget használja. Hozzáfűzi a kimenetet a célfájl végéhez.

$kidobta 'Helló Világ' >>hello.txt

Az stdin célja a bemenettel való munka. Ezt is át lehet irányítani. Például, ahelyett, hogy a billentyűzetről beírná a bevitelt, betöltheti egy fájlból.

Ebben a parancsban a cat közvetlenül a hello.txt fájlból veszi az adatokat.

$macska <hello.txt

Nézzük meg az átirányítást egy másik példával. Ezúttal egy Python -szkriptet fog tartalmazni.

$# pyin.py
$ név= bemenet('Írja be a nevet n')
$email = bemenet('Írja be az e -mail címet n')
$nyomtatás('A neved %s, e -mail címed pedig %s'%(név, email))

A szkript bemenete a hello.txt címen található.

$macskahello.txt

Küldjük el a fájlt a szkript bemeneteként.

$ python3 pyin.py <Helló.txt

Érdekes módon mindkettőt átirányíthatja stdin és stdout ugyanabban a parancssorban. Itt a következő parancs a hello.txt fájlt fogja használni stdin és küldje el a stdout parancsból egy fájlba.

$ python3 pyin.py <Helló.txt >Kimenet.txt

Az stderr átirányítása hasonló az stdout -hoz. Az stderr jelzésére azonban meg kell említenie a 2. azonosító leírást. Ellenkező esetben csak az stdout -ot fogja használni.

Itt átirányítom a stderr szöveges fájlba.

$bármi2>error.txt

Stdout és Stderr átirányítása

Igen, lehetséges mindkettő egyidejű átirányítása. Mindössze annyit kell tennie, hogy megemlíti az 1. és 2. azonosító leírást az átirányítás előtt.

$kidobtaHelló Világ1>output.log2>debug.log

Végső gondolatok

stdin , stdout , és stderr csodálatos funkciók alapértelmezés szerint a bash ajánlatok. Ha szereted a bash szkripteket, ezek használata hihetetlenül hasznos lehet trükkös helyzetekben.

Szeretne többet megtudni a bash szkriptekről? Kezdjük ezzel kezdő útmutató a bash scripteléshez !

Élvezd!