Què són stdin, stderr i stdout a Bash

What Are Stdin Stderr



Sempre que executeu qualsevol ordre al terminal, stdin , stderr , i stdout són tres fluxos de dades que crea bash. Si coneixeu la línia d’ordres, és possible que ja hàgiu aprofitat aquestes funcions. Essencialment, permeten canalitzar / redirigir dades d'una ordre a una altra.

Vegem com stdin , stderr , i stdout funciona i com es poden utilitzar també.







stdin, stdout i stderr

En informàtica, el terme flux es refereix a alguna cosa que pot transferir dades. Aquí, els tres fluxos contenen text com a dades.



De manera similar als corrents d’aigua, els fluxos de dades també tenen dos punts finals. Hi ha una font i una sortida. Qualsevol ordre que executeu al terminal es trobarà a qualsevol punt del flux. Mitjançant el flux, podeu connectar dues finestres de terminal, dues ordres diferents i fins i tot fitxers.



Anem a fer un repartiment ràpid dels fluxos especials.





  • stdin: significa entrada estàndard. Pren text com a entrada.
  • stdout: indica la sortida estàndard. La sortida de text d'una ordre s'emmagatzema al flux normal.
  • stderr: significa error estàndard. Sempre que una ordre s'enfronta a un error, el missatge d'error s'emmagatzema en aquest flux.

A Linux, gairebé tots els fluxos es tracten com si fossin fitxers. Igual que podeu llegir / escriure un fitxer, podeu llegir / escriure dades d’aquestes seqüències.

Una manera fàcil d’accedir a qualsevol fitxer és mitjançant el número descriptor de fitxer únic que s’hi associa. En el cas d’aquests fluxos, hi ha valors únics assignats a cadascun d’ells.



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

stdin, stdout i stderr en acció

Comencem aprenent més sobre aquests fluxos mitjançant l'acció; començarem amb stdin.

Executeu l'ordre següent.

$llegir

L'ordre requerirà l'entrada del teclat. Aquí, l'eina de lectura obté l'entrada de stdin. Ara anem a veure stdout.

Executeu l'ordre primer.

$ls -la

Aquí, l'ordre ls llista els fitxers del directori actual. S'envia la llista a stdout i el terminal ho imprimeix. Comproveu ara stderr.

Hi ha diferents maneres en què es pot produir un error. Per a aquest exemple, si envieu ls un argument no vàlid, es produirà un error.

$ls -laqualsevol cosa

Aquí no hi ha cap fitxer anomenat res. És per això que s’envia el missatge ls returns stderr .

Tubs

Aquesta és una tècnica habitual que aprofita al màxim els fluxos stdin i stdout. Expliquem-ho amb un exemple.

$trobo 'Hola món' | adherènciaHola

Aquí, el | sign és responsable de les canonades. La sortida trobo genera s'escriu a stdout corrent. A continuació, la canalització redirigeix ​​el contingut de stdout a stdin per a l'ordre grep. Així és com grep sap en quin contingut s'ha de realitzar l'operació.

Si voleu connectar tant el stderr com el stdout a l'ordre següent, feu servir el | & en lloc seu.

$troboHola món| & gat

$qualsevol cosa| & gat

Redirecció de corrents

Ara sabem com funcionen aquests fluxos. Vegem com podeu redirigir-los. La canalització és una forma de redirecció. No obstant això, només implica stdin i stdout. Bash permet un control específic sobre els tres fluxos.

Per redirigir el contingut normal a un fitxer, afegiu l'angle> seguit del nom del fitxer de destinació.

$troboHola món>hola.txt

Aquí, la sortida de l'ordre echo s'emmagatzemarà al fitxer hello.txt.

Si el fitxer ja existeix, l'ordre anterior el sobreescriurà. Per evitar-ho, assegureu-vos que el nom del fitxer sigui únic. Si no voleu sobreescriure, és possible que vulgueu utilitzar >>. Afegeix la sortida al final del fitxer de destinació.

$trobo 'Hola món' >>hola.txt

L'objectiu de stdin és treballar amb l'entrada. Això també es pot redirigir. Per exemple, en lloc d’escriure l’entrada des del teclat, es pot carregar des d’un fitxer.

En aquesta ordre, cat agafarà la seva entrada directament des del fitxer hello.txt.

$gat <hola.txt

Vegem la redirecció amb un exemple diferent. Aquesta vegada, implicarà un script Python.

$# pyin.py
$ nom= entrada('Introduïu el nom n')
$correu electrònic = entrada('Introduïu el correu electrònic n')
$imprimir('El vostre nom és% s i el correu electrònic és% s'%(nom, correu electrònic))

L'entrada de l'script es troba a hello.txt.

$gathola.txt

Enviem el fitxer com a entrada del script.

$ python3 pyin.py <Hola.txt

Curiosament, podeu redirigir tots dos stdin i stdout a la mateixa línia d'ordres. Aquí, l'ordre següent utilitzarà hello.txt com a stdin i envieu el fitxer stdout de l'ordre a un fitxer.

$ python3 pyin.py <Hola.txt >sortida.txt

La redirecció de stderr és similar a stdout. Tot i això, heu d’esmentar la descripció ID 2 per indicar stderr. En cas contrari, només farà servir stdout.

Aquí redirigiré el contingut de la pàgina stderr a un fitxer de text.

$qualsevol cosa2>error.txt

Redirecció de Stdout i Stderr

Sí, és possible redirigir tots dos simultàniament. Tot el que necessiteu és esmentar la descripció ID 1 i 2 abans de la redirecció.

$troboHola món1>output.log2>debug.log

Pensaments finals

stdin , stdout , i stderr són funcions meravelloses que ofereixen de manera predeterminada. Si us interessa fer scripts bash, fer-los servir pot ser increïblement útil en situacions complicades.

Voleu obtenir més informació sobre els scripts bash? Comencem amb això guia per a principiants de bash scripting !

Gaudeix-ne!