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!