Vad Är stdin, stdout och stderr på Linux?

0
563
Fatmawati Achmad Zaenuri/Shutterstock.kom

stdin, stdout och stderr är tre uppgifter strömmar som skapas när du startar ett Linux-kommando. Du kan använda dem för att berätta om ditt skript tranporteras eller omdirigeras. Vi visar dig hur.

Bäckar Som Förenar Två Punkter

Så snart du börjar att lära dig mer om Linux-och Unix-liknande operativsystem, kommer du över villkoren stdin, stdout och stederr. Dessa är de tre standard-strömmar som är etablerade när en Linux-kommandot utförs. I databehandling, som en ström är något som kan överföra data. I fallet med dessa strömmar, som data sms: a.

Dataströmmar, som strömmar vatten, har två ändar. De har en källa och ett utflöde. Beroende på vilket operativsystem du använder erbjuder en utgången av varje bild. Den andra änden bestäms av skal som lanserades kommandot. Att slutet kommer att anslutas till den terminal-fönster, som är ansluten till ett rör, eller omdirigeras till en fil eller annat kommando, enligt kommandoraden som inledde kommando.

Linux Standard Strömmar

I Linux, stdin är standard input ström. Detta accepterar text som indata. Sms: a output från kommandot till tanken levereras via stdout (standard ut) stream. Felmeddelanden från kommandot skickas via stderr (standard error) stream.

Så du kan se att det finns två utgående strömmarna, stdout och stderr, och en ingång ström, stdin. Eftersom felmeddelanden och normal utgång var och en har sin egen kanal för att föra dem till det terminal-fönster, de kan hanteras oberoende av varandra.

Strömmar Hanteras På Samma Sätt Som Filer

Strömmar i Linux—liksom nästan allt annat—behandlas som om de vore filer. Du kan läsa text från en fil, och du kan skriva text till en fil. Båda dessa åtgärder innebär en ström av data. Så begreppet hantering av en ström av data som en fil inte är så mycket av en sträcka.

Varje fil associerad med en process tilldelas ett unikt nummer för att identifiera det. Detta är känt som den fil deskriptor. När en åtgärd måste utföras på en fil deskriptor används för att identifiera filen.

Dessa värden används alltid för stdin, stdout och stderr:

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

Att reagera på Rör och Omdirigeringar

För att underlätta någons introduktion till ett ämne, en vanlig teknik är att lära ut en förenklad version av ämne. Till exempel med grammatik, får vi veta att regeln är “innan jag E, utom efter C.” Men faktiskt, det är mer undantag från denna regel än finns det fall att lyda det.

På ett liknande sätt, när man talar om stdin, stdout och stderr det är bekvämt att trava ut accepterat axiom som en process som varken vet eller bryr sig om sina tre bäckar har upphört att gälla. Bör en process hand om sin produktion är att gå till en terminal eller omdirigeras till en fil? Kan det ens berätta om sitt bidrag kommer från tangentbordet eller som förs in från en annan process?

Faktiskt, en process som inte vet—eller åtminstone kan ta reda på det, bör man väljer att in—och det kan förändra sitt beteende därefter om programvaran författaren beslutat att lägga till den funktionaliteten.

Vi kan se denna förändring i beteende är mycket enkelt. Prova dessa två kommandon:

ls

ls | katt

Ls-kommandot fungerar annorlunda om dess output (stdout) är att ledas in i ett annat kommando. Det är ls som växlar till en enda kolumn produktionen, det är inte en konvertering utförs av katt. Och ls gör samma sak om sin produktion är att bli omdirigerad:

ls > capture.txt

katt capture.txt

Omdirigering av stdout och stderr

Det är en fördel att ha fel-meddelanden som levereras av en särskild bild. Det innebär att vi kan omdirigera ett kommando är output (stdout) till en fil och fortfarande se eventuella felmeddelanden (stderr) i terminalfönstret. Du kan reagera fel om du behöver, när de uppstår. Det stoppar även de felmeddelanden som kan förorena fil som stdout har omdirigerats till.

Skriv följande text i en editor och spara den till en fil som heter error.sh.

#!/bin/bash

echo “Om att försöka komma åt en fil som inte existerar”
katt bad-filename.txt

Göra skriptet körbart med detta kommando:

chmod +x error.sh

Den första raden i skriptet ekon sms: a till det terminal-fönster, via stdout ström. Den andra raden försöker öppna en fil som inte existerar. Detta kommer att generera ett felmeddelande som levereras via stderr.

Kör skriptet med det här kommandot:

./error.sh

Vi kan se att både strömmar av produktionen, stdout och stderr, har visats i terminalen i windows.

Låt oss försöka omdirigera utdata till en fil:

./error.sh > capture.txt

Felmeddelandet som levereras via stderr är fortfarande skickas till terminal-fönstret. Vi kan kontrollera innehållet i filen för att se om stdout produktionen gick till filen.

katt capture.txt

Utdata från stdin omdirigeras till den fil som förväntat.

Den > omdirigering symbol fungerar med stdout som standard. Du kan använda en av de numeriska filhandtag till att ange som standard output stream som du vill omdirigera.

Att uttryckligen omdirigera stdout, använd denna omdirigering instruktion:

1>

Att uttryckligen omdirigera stderr, använd denna omdirigering instruktion:

2>

Låt oss försöka att vårt test igen, och den här gången kommer vi att använda 2>:

./error.sh 2> capture.txt

Felmeddelandet är omdirigerad och stdout eko-meddelande skickas till terminal-fönstret:

Låt oss se vad som finns i capture.txt fil.

katt capture.txt

Stderr budskap är i capture.txt som förväntat.

Styra Både stdout och stderr

Visst, om vi kan styra antingen stdout eller stderr till en fil, oberoende av varandra, vi borde kunna omfördela dem båda på samma gång, för att två olika filer?

Ja, vi kan. Detta kommando kommer direkt stdout till en fil som heter capture.txt och stderr till en fil som heter error.txt.

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

Eftersom både strömmar av produktionen–standard output och standard error—omdirigeras till filer, det finns inga synliga utmatning i terminalfönstret. Vi är tillbaka till kommandoraden som om ingenting har inträffat.

Låt oss kolla innehållet i varje fil:

katt capture.txt
katt error.txt

Omdirigering av stdout och stderr till Samma Fil

Det är snyggt, vi har varje standard output strömmar som går till en egen fil. Den enda andra kombinationer vi kan göra är att skicka både stdout och stderr till samma fil.

Vi kan uppnå detta med följande kommando:

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

Låt oss bryta ner det.

  • ./error.sh: Startar error.sh script-fil.
  • > capture.txt: Omdirigeringar stdout ström till capture.txt fil. > är en förkortning för 1>.
  • 2>&1: Detta använder &> omdirigera instruktion. Denna instruktion kan du tala om för skalet att göra en ström kom till samma destination som en annan bild. I det här fallet, vi säger “omdirigera ström 2, stderr, till samma destination som ström 1, stdout, omdirigeras till.”

Det finns ingen synlig produktion. Det är uppmuntrande.

Låt oss kolla capture.txt fil och se vad som finns i det.

katt capture.txt

Både stdout och stderr strömmar har omdirigerats till en enda destination fil.

Att ha produktionen av en ström omdirigeras och tyst kastas bort, med direkt utgång till /dev/null.

Att upptäcka Omdirigering I ett Skript

Vi diskuterade hur ett kommando kan upptäcka om någon av de bäckar som omdirigeras, och kan välja att ändra sitt beteende därefter. Kan vi uppnå detta i våra egna skript? Ja, vi kan. Och det är en mycket enkel teknik för att förstå och använda.

Skriv följande text i en editor och spara den som input.sh.

#!/bin/bash

om [ -t 0 ]; sedan

echo stdin kommer från tangentbordet

annat

echo stdin kommer från ett rör eller en fil

fi

Använd följande kommando för att göra den körbar:

chmod +x input.sh

Den fiffiga del är testet inom hakparenteser. De -t (terminal) alternativ returnerar sant (0) om den fil som är associerat med filen deskriptor avslutas i terminalfönstret. Vi har använt den fil deskriptor 0 argumentet att testet, som representerar stdin.

Om stdin är ansluten till ett terminalfönster testet kommer att visa sig vara sant. Om stdin är ansluten till en fil eller ett rör, test kommer att misslyckas.

Vi kan använda text-fil för att generera indata till skriptet. Här är vi med en som heter dummy.txt.

./input.sh < dummy.txt

Utgången visar att skriften inser att den input som inte kommer från ett tangentbord, det kommer från en fil. Om du valde att du kan variera ditt manus beteende därefter.

Det var med en fil för omdirigering, låt oss prova det med en pipe.

katt dummy.txt | ./input.sh

Manuset är medveten om att dess ingång är att ledas in i det. Eller mer exakt, det inser än en gång att stdin stream inte är ansluten till ett terminalfönster.

Låt oss köra skriptet med varken rör eller omdirigeringar.

./input.sh

Stdin stream är ansluten till det terminal-fönster, och skriptet rapporterar detta i enlighet med detta.

För att kontrollera samma sak med den utgående strömmen, vi behöver ett nytt manus. Skriv följande i en editor och spara den som output.sh.

#!/bin/bash

om [t-1 ]; sedan

echo stdout är att gå till terminal-fönster

annat

echo stdout är omdirigeras eller ledas

fi

Använd följande kommando för att göra den körbar:

chmod +x input.sh

Den enda betydande förändring till det här skriptet är i test i hakparenteser. Vi använder siffran 1 representerar den fil deskriptor för stdout.

Låt oss prova det. Vi kommer att spritsa ut genom katt.

./utdata | katt

Manuset är medveten om att dess utgång är ingen som går direkt till ett terminalfönster.

Vi kan också testa skriptet genom att omdirigera utdata till en fil.

./output.sh > capture.txt

Det är ingen utgång till det terminal-fönster, vi är tyst tillbaka till kommandotolken. Som vi förväntar oss.

Vi kan titta i den capture.txt filen för att se vad som var tagna. Använd följande kommando för att göra så.

katt capture.sh

Återigen, enkel test i vår skriptet upptäcker att stdout) stream är inte skickas direkt till ett terminalfönster.

Om vi kör skript utan att något rör eller omdirigeringar, det ska upptäcka att stdout skickas direkt till terminal-fönstret.

./output.sh

Och det är precis vad vi ser.

Strömmar Av Medvetande

Att veta hur man ska berätta om ditt skript är ansluten till det terminal-fönster, eller ett rör, eller omdirigeras, kan du anpassa sitt beteende därefter.

Loggning och diagnostiska resultatet kan vara mer eller mindre detaljerad, beroende på om det är att gå till skärmen eller till en fil. Felmeddelanden kan loggas till en annan fil än den normala program utgång.

Oftast så är fallet, mer kunskap för fler alternativ.

LÄS NÄSTA

  • “Hur ska Gälla för Apple-Kort
  • “Native App Är Nog Bara en Gammal Webbläsare
  • “Hur man Öppnar Gamla Webbsidor i Internet Explorer på Windows-10
  • “Vad Gör “Yeet” Betyder, och Hur Använder Man Det?
  • “Hur till Skapa Genvägar på Skrivbordet i Windows 10 den Enkla Vägen