Wat Zijn stdin, stdout en stderr op Linux?

0
528
Fatmawati Achmad Zaenuri/Shutterstock.com

stdin, stdout en stderr zijn drie gegevensstromen gemaakt wanneer u start een Linux commando. U kunt ze gebruiken om te vertellen als je scripts worden doorgesluisd of omgeleid. Wij laten u zien hoe.

Stromen Verbinden Van Twee Punten

Zodra je begint te leren over Linux en Unix-achtige besturingssystemen, kom je de termen stdin, stdout, en stederr. Dit zijn de drie standaard streams die zijn opgericht als een Linux commando is uitgevoerd. In computing, a-stroom is iets dat kan de overdracht van gegevens. In het geval van deze stromen, die gegevens is tekst.

Gegevensstromen, net als water stromen, hebben twee uiteinden. Ze hebben een bron en een uitstroom. Welke Linux commando-u zorgt voor een einde van elke stream. Het andere uiteinde wordt bepaald door de shell gestart met de opdracht. Dat einde zal worden aangesloten op het terminal venster is aangesloten op een buis, of omgeleid naar een bestand of andere opdracht, volgens de opdrachtregel gestart met de opdracht.

De Linux Standard Streams

In Linux, stdin is de standaard input stream. Deze tekst accepteert als invoer. Tekst van de output van het commando naar de shell wordt geleverd via de stdout (standaard uit) stream. Foutmeldingen van de opdracht worden verzonden via de stderr (standaard fout) – stroom.

Zo kunt u zien dat er twee output stromen, stdout en stderr, en een input stream, stdin. Omdat de foutmeldingen en de normale uitgang hebben elk hun eigen leiding om ze uit te voeren naar het terminal venster, kunnen ze behandeld worden, onafhankelijk van elkaar.

Streams Worden Behandeld Als Bestanden

Streams in Linux—zoals bijna alles—worden behandeld als waren zij bestanden. Lees je tekst uit een bestand en u kunt tekst in een bestand. Beide van deze acties brengen een stroom van gegevens. Dus het concept van het hanteren van een stroom van gegevens van een bestand niet dat veel van een stuk.

Elk bestand in verband met een proces is, krijgt een uniek nummer te identificeren. Dit is bekend als de beschrijver. Wanneer een actie is vereist om te worden uitgevoerd op een bestand, wordt het bestand descriptor wordt gebruikt voor het identificeren van het bestand.

Deze waarden worden altijd gebruikt voor stdin, stdout en stderr:

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

Reageren op Pijpen en Omleidingen

Het gemak van iemand introductie van een onderwerp, een veel gebruikte techniek is om te leren van een vereenvoudigde versie van het onderwerp. Bijvoorbeeld met de grammatica, worden wij verteld dat de regel is “ik vóór E, behalve na C.” Maar eigenlijk zijn er meer uitzonderingen op deze regel, dan zijn er gevallen dat het gehoorzamen.

In dezelfde geest, wanneer we spreken over stdin, stdout en stderr het is handig om op te draven de aanvaarde axioma dat een proces noch kent noch cares waar de drie standaard streams worden beëindigd. Moet een proces schelen of de output gaat naar de terminal of wordt doorverwezen naar een bestand? Kan het zelfs zien als de invoer afkomstig is van het toetsenbord of het wordt doorgesluisd naar het vanuit een ander proces?

Eigenlijk een proces heeft weten, of ten minste het kan vinden, mag hij kiezen om in te checken en het kunnen veranderen van zijn gedrag dienovereenkomstig als de software auteur besloten om toe te voegen dat de functionaliteit.

We zien deze verandering in gedrag heel gemakkelijk. Probeer deze twee commando ‘ s:

ls

ls | kat

Het ls commando gedraagt zich anders als de uitvoer (stdout) wordt doorgesluisd naar een andere opdracht. Het is ls dat overschakelt naar een enkele kolom van de output, het is geen conversie uitgevoerd door kat. En ls doet hetzelfde als de uitvoer is omgeleid:

ls > capture.txt

kat capture.txt

Het omleiden van stdout en stderr

Er is een voordeel aan het hebben van foutberichten geleverd door een toegewijd stream. Het betekent dat we kunnen omleiden van een opdracht uitvoer (stdout) naar een bestand en nog steeds zie geen fout berichten (stderr) in het terminal-venster. U kunt reageren op de fouten als je, zoals ze zich voordoen. Het stopt ook de foutmeldingen van verontreiniging van het bestand dat stdout is omgeleid in.

Typ de volgende tekst in een teksteditor en sla het op in een bestand met de naam error.sh.

#!/bin/bash

echo “Over om te proberen toegang te krijgen tot een bestand dat niet bestaat”
kat bad-filename.txt

Maak het script uitvoerbaar met dit commando:

chmod +x error.sh

De eerste regel van het script echo ‘ s tekst-naar de terminal-venster, via de stdout stream. De tweede lijn probeert te krijgen tot een bestand dat niet bestaat. Dit genereert een foutbericht dat wordt geleverd via stderr.

Uitvoeren van het script met dit commando:

./error.sh

We kunnen zien dat beide stromen van de output, stdout en stderr, zijn weergegeven in de terminal van windows.

Laten we proberen om het omleiden van de uitvoer naar een bestand:

./error.sh > capture.txt

Het foutbericht dat wordt geleverd via stderr is nog verzonden naar het terminal venster. We kunnen de inhoud van het bestand om te zien of de uitvoer stdout ging naar het bestand.

kat capture.txt

De uitvoer van de invoer werd omgeleid naar het bestand op als verwacht.

De > omleiding symbool werkt met stdout standaard. U kunt een van de numerieke file descriptors om aan te geven dat de standaard output stroom die u wilt omleiden.

Expliciet redirect stdout, gebruik deze omleiding instructie:

1>

Expliciet redirect stderr, gebruik deze omleiding instructie:

2>

Laten we proberen op onze test-opnieuw, en deze keer hebben we gebruik gemaakt van 2>:

./error.sh 2> capture.txt

Het foutbericht wordt omgeleid en de stdout echo-bericht wordt verzonden naar het terminal venster:

Laten we zien wat in de capture.txt -bestand.

kat capture.txt

De stderr bericht capture.txt zoals verwacht.

Het omleiden van Zowel stdout en stderr

Zeker, als we de redirect ofwel stdout of stderr naar een bestand onafhankelijk van elkaar, moeten we in staat zijn om te buigen ze beide op hetzelfde moment, om twee verschillende bestanden?

Ja, dat kunnen we. Deze opdracht zal direct stdout naar een bestand met de naam capture.txt en stderr naar een bestand met de naam error.txt.

./error.sh 1> capture.txt 2> error.txt

Omdat beide stromen van de output–standaard uitvoer en standaard fout—zijn doorgestuurd naar bestanden, is er geen zichtbare output in het terminal-venster. We zijn terug naar de command-line prompt alsof er niets heeft plaatsgevonden.

Kijkt u eens naar de inhoud van elk bestand:

kat capture.txt
kat error.txt

Het omleiden van stdout en stderr naar Hetzelfde Bestand

Dat is netjes, we hebben elk van de standaard output streams gaat zijn eigen bestand. De enige andere combinatie die we kunnen doen is om zowel stdout en stderr naar hetzelfde bestand.

Wij realiseren dit met het volgende commando:

./error.sh > capture.txt 2&>1

Laten we breken die naar beneden.

  • ./error.sh Start de error.sh script bestand.
  • > capture.txt: Leidt de stdout stream naar de capture.txt -bestand. > is een verzamelnaam voor 1>.
  • 2>&1: Deze maakt gebruik van de &> redirect-instructie. Deze instructie kunt u te vertellen van de shell om een stream kreeg naar dezelfde bestemming als een andere stream. In dit geval zeggen we: “redirect stream 2, stderr, naar dezelfde bestemming die stream 1, stdout, wordt doorgestuurd naar.”

Er is geen zichtbare output. Dat is bemoedigend.

Kijkt u eens naar de capture.txt bestand en zie wat er in zit.

kat capture.txt

Zowel de stdout en stderr stromen, worden omgeleid naar een doelbestand.

Om de output van een stroom omgeleid en weer weggegooid, direct voor de uitgang naar /dev/null.

Het opsporen van de Omleiding In een Script

We besproken hoe een opdracht kan detecteren als een van de streams worden omgeleid, en kunnen ervoor kiezen om te veranderen zijn gedrag dienovereenkomstig. Kan dit doen we in onze eigen scripts? Ja, dat kunnen we. En het is een zeer eenvoudige techniek begrijpen en gebruiken.

Typ de volgende tekst in een teksteditor en sla het op als input.sh.

#!/bin/bash

als [ -t 0 ]; then

echo stdin komende van het toetsenbord

anders

echo stdin komt uit een pijp of een bestand

fi

Gebruik de volgende opdracht om het uitvoerbare bestand:

chmod +x input.sh

Het slimme deel is de test binnen de vierkante haken. De -t (terminal) optie geeft als resultaat true (0) als de bestand in verband met de bestandsbeschrijving wordt beëindigd in het terminal-venster. Wij hebben de file descriptor 0 als argument voor de test, wat neerkomt op stdin.

Als stdin is verbonden met een terminal venster de test zal waar blijken te zijn. Als stdin is aangesloten op een bestand of een pijp, de test mislukken.

We kunnen gebruik maken van een handige tekst-bestand te genereren van input voor het script. Hier maken we gebruik van een zogenaamde dummy.txt.

./input.sh < dummy.txt

De output laat zien dat het script erkent dat de invoer is niet afkomstig van een toetsenbord, het is afkomstig uit een bestand. Als u wilt, u kan variëren in uw script gedrag daaraan aan te passen.

Dat was met een bestand omleiding, laten we het proberen met een pijp.

kat dummy.txt | ./input.sh

Het script erkent dat de input wordt doorgesluisd naar het. Of meer precies, het erkent eens te meer dat de stdin stream is niet verbonden met een terminal venster.

Laten we het script uitvoeren met geen van beide pijpen noch omleidingen.

./input.sh

De stdin stroom is aangesloten op het terminal venster, en het script verslagen hiervan.

Om te controleren hetzelfde met de output stream, moeten we een nieuw script. Typ het volgende in een editor en sla het op als output.sh.

#!/bin/bash

als [ -t-1 ]; then

echo stdout gaat het terminal-venster

anders

echo stdout wordt doorverwezen of die is doorgesluisd

fi

Gebruik de volgende opdracht om het uitvoerbare bestand:

chmod +x input.sh

De enige significante wijziging van dit script is in de test in de vierkante haakjes. We gebruiken de cijfers 1 tot en vertegenwoordigen de file descriptor voor stdout.

Laten we het eens proberen. We zullen de output met een pijp door de kat.

./uitgang | kat

Het script erkent dat de output is geen rechtstreeks naar een terminal venster.

We kunnen ook het script testen door het omleiden van de uitvoer naar een bestand.

./output.sh > capture.txt

Er is geen uitgang naar het terminal venster, zijn we stilletjes terug naar de opdrachtprompt. Zoals we gewend zijn.

We kunnen kijken in de capture.txt bestand te zien wat er gevangen werd genomen. Gebruik het volgende commando om dit te doen.

kat capture.sh

Nogmaals, de eenvoudige test in ons script detecteert dat de stdout stream is niet rechtstreeks naar een terminal venster.

Als we het uitvoeren van het script zonder pijpen of omleidingen, moet vaststellen dat stdout wordt rechtstreeks geleverd op het terminal venster.

./output.sh

En dat is precies wat we zien.

Stromen Van Bewustzijn

Weten hoe om te vertellen als je scripts zijn verbonden met de terminal-venster, of een pijp, of worden doorverwezen, kunt u het aanpassen van hun gedrag daaraan aan te passen.

Houtkap en de diagnostische uitvoer kan meer of minder gedetailleerd, afhankelijk van het feit of het gaat naar het scherm of naar een bestand. Fout berichten kunnen worden opgeslagen in een ander bestand dan het normale programma-uitvoer.

Zoals meestal het geval is, is er meer kennis brengt meer opties.

LEES VERDER

  • “Hoe toe te Passen voor de Apple Kaart
  • “Dat de Native App Is Waarschijnlijk Gewoon een Oude Webbrowser
  • “Het Openen van Oude Webpagina’ s in Internet Explorer 10 op Windows
  • “Wat Doet “Yeet” Betekenen, en Hoe Gebruik Je Het?
  • “Het Maken van Snelkoppelingen op het Bureaublad op Windows-10 de Gemakkelijke Manier