Wat zijn stdin, stderr en stdout in Bash

What Are Stdin Stderr



Telkens wanneer een opdracht in de terminal wordt uitgevoerd, standaard , stderr , en stout zijn drie gegevensstromen die bash maakt. Als u bekend bent met de opdrachtregel, heeft u mogelijk al gebruik gemaakt van deze functies. In wezen maken ze het mogelijk om gegevens van de ene opdracht naar de andere door te sturen/omleiden.

Laten we eens kijken hoe standaard , stderr , en stout werkt en hoe je ze ook kunt gebruiken.







stdin, stdout en stderr

In de informatica verwijst de term stream naar iets dat gegevens kan overdragen. Hier dragen alle drie de streams tekst als de gegevens.



Net als waterstromen hebben datastromen ook twee eindpunten. Er is een bron en een uitstroom. Welke opdracht u ook uitvoert in de terminal, deze bevindt zich op elk punt van de stream. Met behulp van de stream kunt u twee terminalvensters, twee verschillende opdrachten en zelfs bestanden verbinden!



Laten we een snel overzicht geven van de speciale streams.





  • stdin: Staat voor standaardinvoer. Het neemt tekst als invoer.
  • stdout: Staat voor standaarduitvoer. De tekstuitvoer van een opdracht wordt opgeslagen in de stdout-stroom.
  • stderr: Staat voor standaardfout. Telkens wanneer een opdracht met een fout wordt geconfronteerd, wordt de foutmelding in deze stream opgeslagen.

In Linux worden bijna alle streams behandeld alsof het bestanden zijn. Net zoals u een bestand kunt lezen/schrijven, kunt u gegevens uit deze streams lezen/schrijven.

Een gemakkelijke manier om toegang te krijgen tot elk bestand is door het unieke bestandsdescriptornummer te gebruiken dat eraan is gekoppeld. In het geval van deze streams zijn er unieke waarden toegewezen aan elk van hen.



  • 0: standaard
  • 1: stdout
  • 2: stderr

stdin, stdout en stderr in actie

Laten we beginnen door meer te leren over deze streams door middel van actie, we zullen beginnen met stdin.

Voer de volgende opdracht uit.

$lezen

De opdracht vereist invoer van het toetsenbord. Hier krijgt de leestool de invoer van stdin. Laten we nu eens kijken naar stdout.

Voer eerst de opdracht uit.

$ls -de

Hier geeft de opdracht ls de bestanden in de huidige map weer. De lijst is verzonden naar: stout en de terminal drukt het af. Laten we nu eens kijken naar stderr.

Er zijn verschillende manieren waarop een fout kan optreden. In dit voorbeeld zal het verzenden van een ongeldig argument naar ls resulteren in een fout.

$ls -deiets

Hier is er geen bestand met de naam iets. Daarom wordt het bericht ls returns gestuurd naar stderr .

Leidingen

Dit is een veelgebruikte techniek die optimaal gebruik maakt van de stdin- en stdout-streams. Laten we het uitleggen met een voorbeeld.

$gooide uit 'Hallo Wereld' | greepHallo

Hier, de | sign is verantwoordelijk voor piping. Het resultaat gooide uit genereert is geschreven in de stout stroom. Vervolgens leidt de piping de inhoud van stdout om naar stdin voor het grep-commando. Zo weet grep op welke inhoud de bewerking moet worden uitgevoerd.

Als je zowel de stderr als stdout naar de volgende opdracht wilt pipen, gebruik dan de |& in plaats daarvan.

$gooide uitHallo Wereld| & kat

$iets| & kat

Streams omleiden

Nu we weten hoe deze streams werken, laten we eens kijken hoe u ze kunt omleiden. Piping is een vorm van omleiding. Het gaat echter alleen om stdin en stdout. Bash biedt specifieke controle over alle drie de streams.

Om de stdout-inhoud om te leiden naar een bestand, voegt u de hoek > toe, gevolgd door de naam van het doelbestand.

$gooide uitHallo Wereld>hallo.txt

Hier wordt de uitvoer van de echo-opdracht opgeslagen in het bestand hello.txt.

Als het bestand al bestond, zal het bovenstaande commando het overschrijven. Om dit te voorkomen, moet u ervoor zorgen dat de bestandsnaam uniek is. Als u niet wilt overschrijven, kunt u in plaats daarvan >> gebruiken. Het voegt de uitvoer toe aan het einde van het doelbestand.

$gooide uit 'Hallo Wereld' >>hallo.txt

Het doel van stdin is om met input te werken. Dit kan ook worden doorverwezen. In plaats van de invoer vanaf het toetsenbord te typen, kan deze bijvoorbeeld vanuit een bestand worden geladen.

In deze opdracht haalt cat zijn invoer rechtstreeks uit het hello.txt-bestand.

$kat <hallo.txt

Laten we eens kijken naar de omleiding met een ander voorbeeld. Deze keer gaat het om een ​​Python-script.

$# pyin.py
$ naam= invoer('Voer naam inN')
$e-mail = invoer('Voer email inN')
$afdrukken('Uw naam is %s en e-mail is %s'%(naam, e-mail))

De invoer voor het script bevindt zich op hello.txt.

$kathallo.txt

Laten we het bestand als invoer voor het script verzenden.

$ python3 pyin.py <Hallo.tekst

Interessant is dat je beide kunt omleiden standaard en stout in dezelfde opdrachtregel. Hier gebruikt de volgende opdracht hello.txt als standaard en stuur de stout van de opdracht naar een bestand.

$ python3 pyin.py <Hallo.tekst >uitvoer.tekst

Het omleiden van stderr is vergelijkbaar met stdout. U moet echter de beschrijving ID 2 vermelden om stderr aan te geven. Anders gebruikt het gewoon stdout.

Hier zal ik de inhoud van de . omleiden stderr naar een tekstbestand.

$iets2>error.txt

Stdout en Stderr omleiden

Ja, het is mogelijk om beide tegelijk om te leiden. Het enige dat u hoeft te doen, is de beschrijving ID 1 en 2 te vermelden vóór de omleiding.

$gooide uitHallo Wereld1>output.log2>debug.log

Laatste gedachten

standaard , stout , en stderr zijn standaard geweldige functies die bash biedt. Als je van bash-scripting houdt, kan het gebruik ervan ongelooflijk handig zijn in lastige situaties.

Meer weten over bash-scripting? Laten we hiermee aan de slag gaan beginnershandleiding voor bash-scripting !

Genieten van!