Velkommen til endnu en fredag ...
Det er tid til at lære en lille del af terminalen at kende. Efter meget eftertanke besluttede jeg at oprette et indlæg om standard strømme; Selvom det vil være overfladisk, tror jeg, det er noget, som alle burde vide.
Standardstrøm
Standardstrøm Den består af flere kommunikationskanaler mellem brugeren og terminalen. Disse "kanaler" til input / output viser eller fanger information, når en kommando udføres.
De 3 I / O-forbindelser er: stdin Standardindgang, stdout Standard output, stderr Standard fejl.
stdin: Standardindgang
Standard input er den måde, hvorpå vi fanger information fra en kommando, enten gennem rør, omdirigering, tastatur osv. Vi identificerer det med filbeskrivelsen 0.
Et eksempel på stdin ville være:
sorter <fortegnelse
Det tager al den information, der er på listen - i dette tilfælde de numre, der er skrevet tilfældigt - og når filen omdirigeres til kommandoen ls, sorterer den den numeriske liste alfabetisk. I dette eksempel er flagene implicitte.
stdout: Standard output
Standard output, som navnet antyder, viser output fra en kommando via konsollen. Hvis vi skriver ls, er al information, det viser os på skærmen, standardoutput. Det er repræsenteret af deskriptor 1.
Nu vil jeg prøve at instantiere stdin og stdout med et script skrevet i bash, simpelthen fordi jeg elsker bash hahaha. 🙂
test.sh
#! / bin / bash hvis [-t 0]; derefter ekko "Du bruger stdout" elif [-t 1]; derefter ekko "Du bruger stdin" ellers ekko "Brutal error" fi
Nu et skærmbillede, der viser, hvordan man bruger scriptet. Når du omdirigerer eller bruger et rør med scriptet, skal du bruge det test -t at vide, om kun stdout-scriptet udføres, og hvis ikke, er det naturligvis stdin.
bash test.sh ls | bash test.sh bash test.sh </ etc / passwd
Husk at ændre kommandoen og øve dig, så du lærer.
stderr: Standardfejl
Standardfejl er den måde, programmer viser fejl eller diagnostik på. Det er repræsenteret af deskriptor 2.
For at forstå konceptet er dette situationen: Når vi vil gemme en kommandofejl, er den første ting, vi tænker på, at omdirigere output til almindelig tekst.
ls> info.txt
Dette fungerer, kommandooplysningerne gemmes i en almindelig tekstfil. Men når du gemmer fejlen, gemmer den ikke den, men den viser den på skærmen, og almindelig tekstfil er tom.
I stedet for hvis vi bruger 2> til at angive at gemme stderr i filen:
ls foo 2> info.txt
Nu gemmer det fejloplysningerne i tekstfilen.
Mest Shell lad stderr og stdout gemmes i en enkelt kommandokommando med &> hvor Foo er et ikke-eksisterende bibliotek
ls Downloads Foo &> info.txt
Denne fil indeholder oplysningerne om fejlen ved udførelse af ls i Foo og viser mapperne under Downloads.
Og endelig, hvad gør det berømt 2> & 1?
Enkel, omdiriger stderr til stdout. Det & i midten af> og 1 betyder, at det vil omdirigere til stdout. Hvis det ikke var der, ville det være noget som ... "omdirigere fejlen til fil 1".
Og med dette er det muligt at omdirigere:
- stdout til en fil
- stderr til en fil
- stdout til stderr
- stderr til stdout
- stderr og stdout til en fil
- blandt andre
Det er det for i dag mennesker. Vi læser og tak, fordi du kom forbi. 😀
Interessant. Takket være dine tutorials kan jeg godt lide Bash meget mere.
Kære, interessante, men du har en fejl på følgende linje:
"Og når du omdirigerer filen til ls-kommandoen", skal den være "og når du omdirigerer filen til sorteringskommandoen".
En hilsen.
Der er en fejl i begyndelsen af teksten, når du angiver kommandoen "ls", skal den være "sort":
"Tag alle de oplysninger, der er på listen - i dette tilfælde de numre, der er skrevet tilfældigt - og omdiriger filen til kommandoen ls (her ville det være sorteret)"
Hilsner og tak for at dele dit arbejde
Dette er fantastisk til cron, hvor du ønsker, at output skal skylles (/ dev / null), men fejlene skal gemmes i filer. Når jeg gør dette, bruger jeg normalt datokommandoen til at angive nøjagtigt, hvornår de mislykkedes.
Bash (sh) har disse værktøjer udviklet af Unix-filosofien "gør en ting, og gør det godt"
Jeg har ikke fundet ud af noget
Haha, det forklares ret godt, hvad har du ikke forstået?