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!