Hva er stdin, stderr og stdout i Bash

What Are Stdin Stderr



Når du kjører en kommando i terminalen, stdin , stderr , og stdout er tre datastrømmer som bash lager. Hvis du er kjent med kommandolinjen, har du kanskje allerede benyttet deg av disse funksjonene. I hovedsak tillater de piping/omdirigering av data fra en kommando til en annen.

La oss sjekke hvordan stdin , stderr , og stdout fungerer og hvordan du kan bruke dem også.







stdin, stdout og stderr

I databehandling refererer begrepet strøm til noe som kan overføre data. Her bærer alle tre strømmer tekst som data.



I likhet med vannstrømmer har datastrømmer også to endepunkter. Det er en kilde og et utløp. Uansett hvilken kommando du kjører i terminalen vil være på begge punktene i strømmen. Ved å bruke strømmen kan du koble til to terminalvinduer, to forskjellige kommandoer og til og med filer!



La oss få en rask oversikt over de spesielle bekkene.





  • stdin: Står for standard inngang. Det tar tekst som input.
  • stdout: Står for standard utgang. Tekstutgangen til en kommando lagres i stdout -strømmen.
  • stderr: Står for standardfeil. Når en kommando står overfor en feil, lagres feilmeldingen i denne strømmen.

I Linux behandles nesten alle strømmer som om de var filer. Akkurat som du kan lese/skrive en fil, kan du lese/skrive data fra disse bekkene.

En enkel måte å få tilgang til hvilken som helst fil er ved å bruke det unike filbeskrivelsesnummeret som er knyttet til den. Når det gjelder disse bekkene, er det unike verdier som er tildelt hver av dem.



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

stdin, stdout og stderr i aksjon

La oss komme i gang med å lære mer om disse bekkene gjennom handling, vi starter med stdin.

Kjør følgende kommando.

$lese

Kommandoen krever input fra tastaturet. Her får leseverktøyet input fra stdin. La oss nå se på stdout.

Kjør kommandoen først.

$ls -de

Her viser ls -kommandoen filen (e) i den nåværende katalogen. Listen sendes til stdout og terminalen skriver den ut. La oss sjekke stderr nå.

Det er forskjellige måter en feil kan oppstå. I dette eksemplet vil det føre til en feil å sende ls et ugyldig argument.

$ls -dehva som helst

Her er det ingen fil som heter noe. Derfor sendes meldingen ls returnerer til stderr .

Rørføring

Dette er en vanlig teknikk som drar full nytte av stdin- og stdout -bekkene. La oss forklare det med et eksempel.

$kastet ut 'Hei Verden' | grepHallo

Her er | skilt er ansvarlig for rørføring. Utgangen kastet ut genererer er skrevet i stdout strøm. Deretter omdirigerer pipingen innholdet i stdout til stdin for grep -kommandoen. Det er slik grep vet hvilket innhold han skal utføre operasjonen på.

Hvis du vil koble både stderr og stdout til neste kommando, bruk deretter | & i stedet.

$kastet utHei Verden| & katt

$hva som helst| & katt

Omdirigere bekker

Nå vet vi hvordan disse strømmer fungerer, la oss se på hvordan du kan omdirigere dem. Rørlegging er en form for omdirigering. Imidlertid involverer det bare stdin og stdout. Bash tillater spesifikk kontroll over alle de tre bekkene.

For å omdirigere stdout -innholdet til en fil, legger du til> vinkelen etterfulgt av målfilnavnet.

$kastet utHei Verden>hei.txt

Her vil utdataene fra ekkokommandoen lagres i hello.txt -filen.

Hvis filen allerede eksisterer, vil kommandoen ovenfor overskrive den. For å unngå det, må du kontrollere at filnavnet er unikt. Hvis du ikke vil overskrive, kan det være lurt å bruke >> i stedet. Den legger utgangen på slutten av målfilen.

$kastet ut 'Hei Verden' >>hei.txt

Målet med stdin er å jobbe med input. Dette kan også omdirigeres. For eksempel, i stedet for å skrive inngangen fra tastaturet, kan den lastes fra en fil.

I denne kommandoen vil cat ta input direkte fra hello.txt -filen.

$katt <hei.txt

La oss sjekke omdirigeringen med et annet eksempel. Denne gangen kommer det til å involvere et Python -skript.

$# pyin.py
$ navn= input('Skriv inn navn n')
$e -post = input('Skriv inn e -post n')
$skrive ut('Ditt navn er %s og e -posten er %s'%(Navn, e -post))

Inndataene for skriptet ligger på hello.txt.

$katthei.txt

La oss sende filen som input for skriptet.

$ python3 pyin.py <Hallo.tekst

Interessant nok kan du omdirigere begge deler stdin og stdout på samme kommandolinje. Her vil følgende kommando bruke hello.txt som stdin og send stdout av kommandoen til en fil.

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

Omdirigere stderr ligner stdout. Du må imidlertid nevne beskrivelses -ID 2 for å indikere stderr. Ellers bruker den bare stdout.

Her omdirigerer jeg innholdet i stderr til en tekstfil.

$hva som helst2>error.txt

Omdirigerer Stdout og Stderr

Ja, det er mulig å omdirigere dem begge samtidig. Alt du trenger er å nevne beskrivelsen ID 1 og 2 før omdirigering.

$kastet utHei Verden1>output.log2>debug.log

Siste tanker

stdin , stdout , og stderr er fantastiske funksjoner bash tilbyr som standard. Hvis du liker bash scripting, kan bruk av dem være utrolig nyttig i vanskelige situasjoner.

Vil du lære mer om bash scripting? La oss komme i gang med dette nybegynnerguide for bash -skripting !

Nyt!