Vad är stdin, stderr och stdout i Bash

What Are Stdin Stderr



När du kör ett kommando i terminalen, stdin , stderr , och stdout är tre dataströmmar som bash skapar. Om du är bekant med kommandoraden kan du redan ha utnyttjat dessa funktioner. I huvudsak tillåter de piping/omdirigering av data från ett kommando till ett annat.

Låt oss kolla hur stdin , stderr , och stdout fungerar och hur du kan använda dem också.







stdin, stdout och stderr

I datorer hänvisar termen ström till något som kan överföra data. Här bär alla tre strömmar text som data.



I likhet med vattenströmmar har dataströmmar också två slutpunkter. Det finns en källa och ett utflöde. Vilket kommando du än kör i terminalen kommer att finnas vid båda punkterna i strömmen. Med strömmen kan du ansluta två terminalfönster, två olika kommandon och till och med filer!



Låt oss få en snabb uppdelning av de speciella strömmarna.





  • stdin: Står för standardinmatning. Det tar text som input.
  • stdout: Står för standardutmatning. Textutmatningen för ett kommando lagras i stdout -strömmen.
  • stderr: Står för standardfel. När ett kommando står inför ett fel lagras felmeddelandet i den här strömmen.

I Linux behandlas nästan alla strömmar som om de vore filer. Precis som du kan läsa/skriva en fil kan du läsa/skriva data från dessa strömmar.

Ett enkelt sätt att komma åt alla filer är att använda det unika filbeskrivningsnumret som är associerat med den. När det gäller dessa strömmar finns det unika värden som tilldelats var och en av dem.



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

stdin, stdout och stderr i aktion

Låt oss komma igång genom att lära oss mer om dessa strömmar genom handling, vi börjar med stdin.

Kör följande kommando.

$läsa

Kommandot kräver inmatning från tangentbordet. Här får läsverktyget input från stdin. Låt oss nu titta på stdout.

Kör kommandot först.

$ls -de

Här listar kommandot ls filen / filerna i den aktuella katalogen. Listan skickas till stdout och terminalen skriver ut den. Låt oss kontrollera stderr nu.

Det finns olika sätt ett fel kan uppstå. I det här exemplet kommer ett fel att sändas till ett ogiltigt argument.

$ls -denågot

Här finns det ingen fil som heter något. Det är därför meddelandet ls returnerar skickas till stderr .

Rör

Detta är en vanlig teknik som drar full nytta av stdin- och stdout -strömmarna. Låt oss förklara det med ett exempel.

$kastade ut 'Hej världen' | greppHej

Här är | skylt ansvarar för rörledning. Utgången kastade ut genererar är skrivet i stdout ström. Därefter omdirigerar röret innehållet i stdout till stdin för kommandot grep. Det är så grep vet vilket innehåll som ska utföras på.

Om du vill leda både stderr och stdout till nästa kommando använder du | & istället.

$kastade utHej världen| & katt

$något| & katt

Omdirigera strömmar

Nu vet vi hur dessa strömmar fungerar, låt oss titta på hur du kan omdirigera dem. Rörledningar är en form av omdirigering. Det innebär dock bara stdin och stdout. Bash tillåter specifik kontroll över alla tre strömmarna.

Om du vill omdirigera stdout -innehållet till en fil lägger du till> vinkeln följt av målfilnamnet.

$kastade utHej världen>hej.txt

Här kommer utmatningen från echo -kommandot att lagras i hello.txt -filen.

Om filen redan finns, kommer kommandot ovan att skriva över den. För att undvika det, se till att filnamnet är unikt. Om du inte vill skriva över kan du använda >> istället. Det lägger till utmatningen i slutet av målfilen.

$kastade ut 'Hej världen' >>hej.txt

Målet med stdin är att arbeta med input. Detta kan också omdirigeras. Till exempel, istället för att skriva inmatningen från tangentbordet, kan den laddas från en fil.

I det här kommandot tar cat sin input direkt från hello.txt -filen.

$katt <hej.txt

Låt oss kolla omdirigeringen med ett annat exempel. Den här gången kommer det att innebära ett Python -skript.

$# pyin.py
$ namn= inmatning('Skriv namn n')
$e-post = inmatning('Skriv in e-mail n')
$skriva ut('Ditt namn är %s och e -post är %s'%(namn, e-post))

Ingången för manuset finns på hello.txt.

$katthej.txt

Låt oss skicka filen som inmatning för skriptet.

$ python3 pyin.py <Hej.Text

Intressant nog kan du omdirigera båda stdin och stdout på samma kommandorad. Här kommer följande kommando att använda hello.txt som stdin och skicka stdout av kommandot till en fil.

$ python3 pyin.py <Hej.Text >produktion.Text

Omdirigera stderr liknar stdout. Du måste dock nämna beskrivnings -ID 2 för att ange stderr. Annars använder den bara stdout.

Här kommer jag att omdirigera innehållet i stderr till en textfil.

$något2>error.txt

Omdirigerar Stdout och Stderr

Ja, det är möjligt att omdirigera båda samtidigt. Allt du behöver är att nämna beskrivnings -ID 1 och 2 innan omdirigeringen.

$kastade utHej världen1>output.log2>debug.log

Slutgiltiga tankar

stdin , stdout , och stderr är underbara funktioner bash erbjuder som standard. Om du gillar bash scripting kan det vara oerhört användbart att använda dem i knepiga situationer.

Vill du lära dig mer om bash -skript? Låt oss börja med detta nybörjarguide för bash scripting !

Njut av!