Suuna väljund faili ümber. Standardsete sisend-/väljundvoogude ümbersuunamine

1403

"2>&1", ">/dev/null" või väljundvoogude ümbersuunamine Unixis (bash/sh)

Sinu hinnang: meistriteos imeline väga hea hea normaalne ei ole lugenud talutav keskpärane halb väga halb ära loe

Väljundvood

Skriptiteated väljastatakse täpselt määratletud voogudesse – väljundvoogudesse. Mida me siis väljastame

kaja "Tere, maailm!"

Mitte ainult ekraanil kuvatuna, vaid süsteemi ja konkreetselt käsutõlkide sh ja bash seisukohast väljastatakse see läbi kindla väljundvoo. Kaja puhul voo number 1 (stdout), millega ekraan on seotud.

Mõned programmid ja skriptid kasutavad ka teistsugust väljundvoogu – number 2 (stderr). Nad kuvavad seal veateateid. See võimaldab voogudest eraldada tavainfot ja veateateid ning neid eraldi suunata ja töödelda.

Näiteks saate blokeerida teabeteadete väljundi, jättes alles ainult veateated. Või saatke veateated logimiseks eraldi faili.

Mis on ">mingi fail"

See Unixi kirje (bash- ja sh-tõlgites) näitab väljundvoogude ümbersuunamist.

Järgmises näites suuname kõik ls-käsu informatiivsed (tavalised) sõnumid ümber faili myfile.txt, nii et selles failis on ainult ls-i loend:

$ ls > minu fail.txt


Sel juhul ei näe sa peale Enter vajutamist ekraanil midagi, kuid failis myfile.txt on kõik see, mis oleks pidanud ekraanil olema.

Teeme aga tahtlikult eksliku toimingu:

$ ls /masdfasdf > minu fail.txt


Mis siis saab? Sest masdfasdf kataloogi failisüsteemi juurtes ei eksisteeri (oletan nii - mis siis, kui teete?), siis käsk ls genereerib vea. Kuid see ei viska selle vea mitte tavalise stdout-voo (1), vaid veavoo stderr (2) kaudu. Ja ümbersuunamine on määratud ainult stdout ("> myfile.txt" jaoks).

Sest me ei suunanud stderr(2) voogu kuhugi - veateade ilmub ekraanile ja EI ilmu faili myfile.txt

Nüüd käivitame käsu ls nii, et infoandmed kirjutatakse faili myfile.txt ja veateated kirjutatakse faili myfile.err, kusjuures täitmise ajal ei ilmu ekraanile midagi:

$ ls > minu fail.txt 2 > minu fail.err


Siin kohtame esimest korda voonumbri märkimist ümbersuunamisel. Kirje "2>myfile.err" näitab, et voog number 2 (stderr) tuleks suunata faili myfile.err.

Loomulikult saame suunata mõlemad vood samasse faili või samasse seadmesse.

2>&1

Sellise kirje võib sageli leida skriptides. See tähendab: "Oma voo number 2 ümbersuunamine voogu number 1" või "Stream stderr – ümbersuunamine voo stdout kaudu". Need. Me suuname kõik veateated läbi lõime, mille kaudu tavaliselt prinditakse tavalised veateated.

$ ls /asfasdf 2>&1


Siin on veel üks näide, kus kõik kirjad suunatakse ümber faili myfile.txt:

$ ls /asfasdf >minufail.txt 2>&1


Sel juhul kirjutatakse kõik veateated, nii veateated kui ka tavalised, faili myfile.txt, sest Esmalt suunasime stdout-voo ümber faili ja seejärel andsime teada, et vead tuleks sisestada stdout-faili - vastavalt faili myfile.txt

/dev/null

Kuid mõnikord peame lihtsalt kõik sõnumid peitma – neid salvestamata. Need. lihtsalt blokeerige väljund. Selleks kasutatakse virtuaalseadet /dev/null. Järgmises näites suuname kõik tavaliste sõnumite väljundid käsust ls kausta /dev/null:

$ ls > /dev/null


Ekraanil ei kuvata midagi peale veateadete. Järgmises näites blokeeritakse veateated:

$ ls > /dev/null 2>&1


Lisaks on see kirje võrdväärne kirjega kujul:

$ ls >/dev/null 2>/dev/null


Järgmises näites blokeerime ainult veateated:

$ ls 2>/dev/null

Pange tähele, et te ei saa siin enam määrata "2>&1", kuna voogu (1) ei suunata kuhugi ja sel juhul ilmuvad ekraanile lihtsalt veateated.

Mis on enne – muna või kana?

Toon siin 2 näidet.

Näide 1)

$ ls >/dev/null 2>&1


Näide 2)

$ ls 2>&1 >/dev/null


Välimuselt ei muutu summa silpide kohti ümber paigutades. Kuid ümbersuunamisosutajate järjekord on oluline!

Asi on selles, et tõlgid loevad ja rakendavad ümbersuunamisi vasakult paremale. Ja nüüd vaatame mõlemat näidet.

Näide 1

1) ">/dev/null" – suuname voo 1 (stdout) asukohta /dev/null. Kõik voogu (1) sisenevad sõnumid saadetakse aadressile /dev/null.

2) "2>&1" – suuname voo 2 (stderr) ümber voogu 1 (stdout). Aga sest 1. lõim on juba seotud /dev/null - kõik kirjad jõuavad ikkagi kausta /dev/null.

Tulemus: ekraan on tühi.

Näide 2

1) "2>&1" – suuname veavoo stderr (2) ümber stdout-voogu (1). Samal ajal, kuna 1. lõime on vaikimisi terminaliga seotud – veateateid näeme ekraanil edukalt.

2) ">/dev/null" - ja siin suuname lõime 1 ümber /dev/null. Ja me ei näe tavalisi sõnumeid.

Tulemus: me näeme ekraanil veateateid, kuid ei näe tavalisi sõnumeid.

Järeldus: kõigepealt suunake voog ümber, seejärel linkige sellele.

Kuigi programmid tegelevad tavaliselt standardsete I/O voogudega, nagu öeldud, on kestal sisend-/väljundi ümbersuunamiseks spetsiaalsed vahendid.

5.5.1 Operaatorid >,< и >>

Ümbersuunamise tähistamiseks kasutatakse sümboleid " > ", "< "Ja" >> ". Kõige sagedamini kasutatakse käsu väljundi ümbersuunamiseks faili. Siin on näide:

$ ls -l > /home/jim/dir.txt

See käsk salvestab faili /home/jim/dir.txt kataloogi failide ja alamkataloogide loendi, mis oli käsu täitmise ajal kehtiv ls; Veelgi enam, kui määratud faili ei eksisteerinud, luuakse see; kui see oli olemas, kirjutatakse see üle; kui soovid, et käsu väljund lisataks olemasoleva faili lõppu, siis vajaliku sümboli asemel > kasutada >> . Sel juhul tühikute olemasolu enne või pärast märke > või >> on ebaoluline ja teenib ainult kasutaja mugavust.

Väljundit saate saata mitte ainult faili, vaid ka mõne teise käsu sisendisse või seadmesse (näiteks printerisse). Seega saate failis /home/jim/report.txt olevate sõnade loendamiseks kasutada järgmist käsku:

$ cat /home/jim/report.txt > wc -w

ja faili printimiseks kasutage käsku:

$ cat /home/jim/report.txt > lpr

Nagu näete, operaator > kasutatakse väljundvoo ümbersuunamiseks. Seoses sisendvooga täidab sarnast funktsiooni operaator < . Ülaltoodud näidiskäsku konkreetse faili sõnade arvu loendamiseks saab ümber kirjutada järgmiselt (pange tähele käsu puudumist kass):

$ wc -w< /home/jim/report.txt

Seda ümbersuunamissuvandit kasutatakse sageli erinevates skriptides käskude jaoks, mis tavaliselt aktsepteerivad (või eeldavad) klaviatuurisisendit. Skriptis, mis automatiseerib mõningaid rutiinseid toiminguid, saab käsule anda vajaliku teabe failist, kuhu on eelsalvestatud see, mida selle käsu täitmiseks tuleb sisestada.

Tulenevalt asjaolust, et sümbolid < , > Ja >> toimige standardsete voogudega, saab neid kasutada mitte ainult tavapärasel viisil, nagu tavaliselt tehakse, vaid ka veidi erineval viisil. Seega on järgmised käsud samaväärsed:

$ kass > fail

$cat>fail

$ > faili kass

$ > faili kass

Kuid iseenesest (ilma ühegi käsuta, mille jaoks on määratletud standardsed vood) ümbersuunamissümbolit kasutada ei saa, seega ei saa seda näiteks sisestada

$fail1 > fail2

hankige failist koopia. Kuid see ei vähenda selle mehhanismi tähtsust, sest iga käsu jaoks on määratletud standardlõimed. Sel juhul saate ümber suunata mitte ainult standardse sisendi ja väljundi, vaid ka muid vooge. Selleks määrake enne ümbersuunamissümbolit ümbersuunatud voo number. Standardsisendi stdin on number 0, standardväljundi stdout on number 1, standardne veateade stderr on number 2. See tähendab, et ümbersuunamiskäsu täielik vorming on (pidage meeles, et tühikud > lähedal on valikulised):

käsk N>M

Kus N Ja M— standardsete voogude arv (0,1,2) või failinimed. Mõnel juhul sümbolite kasutamine < , > Ja >> kanali numbrit või failinime määramata on võimalik ainult seetõttu, et vaikimisi asendatakse 1 puuduva numbri, st standardväljundiga. Jah, operaator > ilma arvu määramata tõlgendatakse kui 1 > .

Lisaks tavaliste voogude lihtsalt ümbersuunamisele on võimalik ka mitte ainult voogu ühele või teisele kanalile suunata, vaid teha standardse voo sisust koopia. Selle jaoks on spetsiaalne sümbol & , mis asetatakse kanali numbri ette, kuhu voog suunatakse:

käsk N > &M

See käsk tähendab kanali numbri väljundit N saadetakse nii standardväljundisse kui ka dubleeritakse kanali numbrisse M. Näiteks selleks, et standardväljundis veateated dubleeritaks, tuleb anda käsk 2>&1, samal ajal 1>&2 dubleerib stdout faili stderr. See funktsioon on eriti kasulik väljundi faili suunamisel, kuna me näeme siis sõnumeid ekraanil ja salvestame need faili.

5.5.2 Operaator |

Väljundi ümbersuunamise erivõimalus on tarkvarakanal (mõnikord nimetatakse seda toruks või konveieriks). Selleks ühendatakse kaks või enam käsku, nii et eelmise väljund on järgmise sisendiks, ühendatud (või soovi korral eraldatud) vertikaalse riba märgiga - "|". Sel juhul sümbolist vasakul asuva käsu standardne väljundvoog | , saadetakse sümbolist paremal asuvasse programmi standardsisendisse | . Näiteks:

$ kassi minu fail | grep Linux | wc -l

See rida tähendab, et käsu väljund on kass, st tekst failist myfile, saadetakse käsusisendisse grep, mis tõstab esile ainult read, mis sisaldavad sõna "Linux". Käsu väljund grep suunatakse omakorda käsusisendisse wc -l, mis loendab selliste ridade arvu.

Programmitorusid kasutatakse mitme väikese programmi kombineerimiseks, millest igaüks teostab oma sisendvoos ainult spetsiifilisi teisendusi, et luua üldistatud käsk, mille tulemuseks on mõni keerulisem teisendus.

Tuleb märkida, et kest kutsub samaaegselt täitma kõiki konveierisse kuuluvaid käske, käivitades iga käsu jaoks eraldi kesta eksemplari, nii et niipea kui esimene programm hakkab oma väljundvoos midagi tootma, järgmine käsk hakkab seda töötlema. Samamoodi teostab iga järgnev käsk oma operatsiooni, oodates eelmise käsu andmeid ja andes oma tulemused järgmise käsu sisendiks. Kui soovite, et käsk lõpetataks täielikult enne järgmise algust, saate seda kasutada ühel real konveieri sümbolina | , ja semikoolon ; . Enne iga semikoolonit peatub kest ja ootab, kuni kõik eelnevad konveierisse lisatud käsud täitmise lõpetavad.

Torust väljumise olek (pärast programmi lõpetamist tagastatud tõeväärtus) on sama, mis konveieri viimase käsuga tagastatud väljumisolek. Konveieri esimese käsu ette saab panna sümboli "!", siis on konveierist väljumise olek viimase käsu väljumisoleku loogiline eitus. Enne tagastamisväärtuse määramist ootab kest, kuni kõik konveierikäsud on lõpule viidud.

5.5.3 Filtrid

Viimane ülaltoodud näide (käsuga grep) saab kasutada veel ühe olulise mõiste, nimelt filtriprogrammi illustreerimiseks. Filtrid on käsud (või programmid), mis võtavad vastu sisendandmevoo, sooritavad selles mõningaid teisendusi ja väljastavad tulemuse standardväljundisse (kust saab selle kasutaja äranägemise järgi mujale suunata). Filtrikäsud sisaldavad juba eespool mainitud käske kass, rohkem, vähem, wc, cmp, diff, samuti järgmised käsud.

Tabel 5.1. Filtreerimiskäsud

Meeskond

Lühike kirjeldus

grep, fgrep, egrep

Otsib sisendfailist või standardsisendist määratud mustrit sisaldavaid ridu ja kirjutab need standardväljundisse

Asendab kõik antud loendis loetletud sisendvoos esinevad märgid teise määratud loendi vastavate tähemärkidega

komm

Võrdleb kahte faili ridade kaupa ja väljastab 3 veergu standardväljundiks: üks - read, mis esinevad ainult ühes failis, teine ​​- read, mis esinevad ainult 2. failis: ja kolmas - read, mis esinevad mõlemas failis

Vormindab printimiseks tekstifaili või standardsisendi sisu

sed

Stringiredaktor, mida kasutatakse sisendandmevoo teatud teisenduste tegemiseks (võetud failist või standardsisendist)

Spetsiaalne filter on käsk tee, mis "tükeldab" sisendvoo, suunates selle ühelt poolt standardväljundisse ja teiselt poolt faili (mille nime peate täpsustama). On lihtne näha, et oma tegevusega käsk tee sarnane ümbersuunamisoperaatoriga 1>&fail.

Filtrite võimalusi saab oluliselt laiendada regulaaravaldiste kasutamisega, mis võimaldavad korraldada näiteks otsingut erinevate, sageli väga keeruliste mustrite abil.

Ümbersuunamise ja filtrite kohta võiks palju rääkida. Kuid see materjal on saadaval enamikes UNIXi ja Linuxi raamatutes, näiteks Petersenis [P1.4] ja Kelly-Bootle'is [P1.8]. Seetõttu piirdume öelduga ja liigume edasi nn kesta loodud keskkonna ehk keskkonna käsitlemise juurde.

V. Kostromin (kos at rus-linux dot net) - 5,5. I/O ümbersuunamine, kanalid ja filtrid

Iga programm on "automaatne masin", mis on loodud andmete töötlemiseks: saades sisendiks üht teavet, toodab see oma töö tulemusena teise. Kuigi sissetulev ja/või väljaminev teave võib olla null, st lihtsalt puududa. Andmed, mis programmi töötlemiseks edastatakse, on selle sisend, see, mida ta töö tulemusena toodab, on väljund. Iga programmi sisendi ja väljundi korraldamine on operatsioonisüsteemi ülesanne.

Iga programm töötab teatud tüüpi andmetega: tekst, graafika, heli jne. Nagu ilmselt on juba selgunud, on Linuxis peamine süsteemihaldusliides terminal, mis on mõeldud tekstiinfo edastamiseks kasutajalt süsteemi ja tagasi. Kuna terminalist saab sisestada ja väljastada ainult tekstiinfot, peab ka terminaliga seotud programmide sisend ja väljund olema tekst. Tekstiandmetega opereerimise vajadus ei piira aga süsteemihaldusvõimalusi, vaid, vastupidi, laiendab neid. Inimene saab lugeda mis tahes programmi väljundit ja aru saada, mis süsteemis toimub ning erinevad programmid osutuvad omavahel ühilduvateks, kuna kasutavad sama tüüpi andmete esitust – teksti.

Käsud ja skriptid saavad sisendit vastu võtta kahel viisil: standardsisendist (klaviatuuriga lingitud) või failist. Sarnane eraldatus on olemas ka väljundi jaoks: käsu või skripti väljund saadetakse vaikimisi terminali ekraanile, kuid saate selle faili ümber suunata. Kui töö käigus ilmnevad vead. ekraanile kuvatakse ka nende kohta käivad teated ning vigade voo saab suunata ka faili.

Vaatame esmalt paari käsku, mida saab kasutada I/O korraldamiseks.

Väljundkäsud standardsele väljundseadmele

Linux pakub sõnumite standardväljundisse printimiseks mitmeid käske:

  • kaja – stringi printimine standardväljundisse.
  • printf – vormindatud teksti printimine standardväljundisse.
  • jah – Korduva teksti printimine standardväljundisse.
  • seq – numbrijada printimine standardväljundisse
  • Clear Ekraani või akna tühjendamine.

Näiteks kui kasutate käsku echo, kui määrate juhtmärgi \c, siis väljundi lõppedes uuele reale üleminekut ei toimu:

$ echo "Mis su nimi on?\c"

Mis su nimi on? $

Siin on $ kutse sümbol.

Rida saab arvutada ka kestamuutujate ja isegi muude käskude väärtusi. Näiteks järgmine käsk ütleb teile, mis on praeguse kasutaja kodukataloog (keskkonnamuutuja $HOME) ja millise terminaliga ta on ühendatud (käsk tty on ümbritsetud tagasijutumärkidega, nii et tõlk paneb selle täitmise tulemuse rida).

$ echo "Teie kodukataloog on $HOME, olete ühendatud terminaliga - `tty` "

Teie kodukataloog on /home/knoppix, olete ühendatud terminaliga - /dev/tty1

Kuna topeltjutumärkidel on shellistõlgis erieesmärk, tuleb topeltjutumärkide lisamiseks väljundstringi nende erieesmärk tühistada, kasutades kaldkriipsu (\). See tühistab mis tahes erimärgi määramise.

Näiteks stringi "/dev/tty1" kuvamiseks peate käivitama:

$echo “\”/dev/tty1\””

Sisestuskäsud standardsest sisendseadmest

Käsk Read loeb standardsisendist ühe rea ja kirjutab selle sisu määratud muutujatele. Mitme muutuja määramisel kirjutatakse esimene sõna esimesele, teine ​​sõna teisele jne. viimane sisaldab ülejäänud rida.

Järgmine skript kutsub iga muutuja lugemiseks eraldi lugemiskäsu.


$ kassi test
#!/bin/bash
echo "Nimi: \c"
loe nimi
kaja "Perenimi: \c"
loe perekonnanime
echo “Eesnimi=” $nimi “Perenimi=” $perekonnanimi

Seejärel peate selle skripti käivitamiseks andma testfailile täitmisõiguse: chmod 0755 test ja käivitage see./test. Hukkamise tulemus: Eesnimi: Ivan Perekonnanimi: Petrov Eesnimi=Ivan Perekonnanimi=Petrov

STANDARDNE SISEND, VÄLJUND JA VEATEGO

Iga käsutõlgist käivitatud programm saab kolm avatud I/O voogu:

Standardsisend (sldin) – standardväljund (sldout) – standardvea väljund (stderr)

Vaikimisi on need lõimed terminaliga seotud. Need. Kõik programmid, mis ei kasuta muid vooge peale standardsete, ootavad terminali klaviatuurilt sisendit, sealhulgas veateated.

Veelgi enam, iga shell-tõlgendis käivitatav protsess (käsk, skript jne) on seotud mitme avatud failiga, millest protsess saab lugeda oma andmeid ja kuhu need kirjutada. Kõik need failid on identifitseeritud numbriga, mida nimetatakse failideskriptoriks, kuid esimesed kolm faili on vaikimisi sisend-/väljundvood:

Faili deskriptor
Standardsisend 0
Standardväljund 1
Standardne veavoog 2

Tegelikkuses luuakse 12 avatud faili, kuid failid deskriptoritega 0, 1 ja 2 on reserveeritud standardse sisendi, väljundi ja vea jaoks. Kasutajad saavad töötada ka failidega, mille failideskriptorid on 3 kuni 9 (reserveeritud).

Standardse sisendfaili (sldin) käepide on 0. Sellest failist eraldavad protsessid oma sisendandmed. Vaikimisi on sisendvoog seotud klaviatuuriga (seade /dev/tty), kuid enamasti tuleb see toru kaudu teistest protsessidest või tavalisest failist.

Tavalisel väljundfailil (stdout) on käepide 1. Sellesse faili kirjutatakse kogu protsessi väljund. Vaikimisi väljastatakse andmed terminali ekraanile (device/dev/tty), kuid neid saab ka faili ümber suunata või teise protsessi suunata.

Standardse veavoo (siderr) failil on deskriptor 2. Sellesse faili kirjutatakse käsu täitmisel ilmnevad veateated. Vaikimisi väljastatakse veateated terminali ekraanile (seade /dev/tty), kuid neid saab ka faili suunata. Miks eraldada logimisvigade jaoks spetsiaalne fail? Fakt on see, et see on väga mugav viis tegelike väljundandmete eraldamiseks käsu töö tulemustest, aga ka hea võimalus erinevate logifailide hoolduse tõhusaks korraldamiseks.

Suur hulk utiliite kasutab ainult standardseid vooge. Selliste programmide puhul võimaldab kest I/O-vooge iseseisvalt ümber suunata. Näiteks saate tõrketeateid maha suruda, määrata faili sisendi või väljundi.

Need. Käskude kutsumisel saab määrata, kuhu tuleb sisend vastu võtta ja kuhu väljund saata, samuti veateateid. Vaikimisi eeldatakse, kui pole teisiti määratud, töötamist terminaliga: andmed sisestatakse klaviatuurilt ja kuvatakse ekraanil. Kuid shelli interpretaatoril on ümbersuunamismehhanism, mis võimaldab standardseid vooge seostada erinevate failidega. Sel juhul tuleb standardse veavoo ümbersuunamisel määrata faili deskriptor (2). See pole sisend- ja väljundvoogude jaoks vajalik.

Kasulik erijuht lõime ümbersuunamise mehhanismi kasutamisel on ümbersuunamine /dev/null, mis võimaldab vabaneda ebavajalikest sõnumitest ekraanil. Sama mehhanismi kasutades saate luua tühje faile:

% cat myfile – loob praeguses kataloogis tühja faili myfile.

/dev/null on spetsiaalne fail, mis on nn. "tühi seade" Sellele kirjutamine toimub edukalt, olenemata “salvestatud” teabe hulgast. /dev/null lugemine võrdub faili EOF lõpu lugemisega.

I/O voogude ümbersuunamine viiakse läbi nagu DOS (täpsemalt võttis DOS OS kasutusele süntaksi voogude ümbersuunamiseks UNIXist), kasutades sümboleid:

- suunata standardväljundvoo ümber
- standardse väljundvoo ümbersuunamine lisamisrežiimis
- standardse sisendvoo ümbersuunamine
- saada andmeid standardsisendist, kuni ilmneb eraldaja

Erinevalt DOS-ist käivitab UNIX/Linux OS aga kahe protsessi vahel programmikanali loomisel mõlemad protsessid samaaegselt ja edastab info läbi süsteemipuhvri (ilma vahepealse salvestamiseta kõvakettale). Seega on UNIX/Linux OS-i tarkvarakanalid väga tõhus vahetusviis. Kui süsteemi puhver täitub üle (näiteks kui "saatmisprogramm" väljastab kanalile teavet kiiremini, kui "vastuvõttev" programm suudab seda töödelda), peatab operatsioonisüsteem kanalile kirjutamise protsessi automaatselt, kuni puhver ilmub. on vabastatud.

Kõige tavalisemad ümbersuunamisoperaatorid

Nr Süntaksi kirjeldus
1 käsufail Suunab standardväljundi uude faili

2 käsk 1 fail Suunab standardväljundi määratud faili

3 failikäsk Suunab standardväljundi määratud failile (manustamisrežiim)

4 käsufail 2&1 Suunab standardväljundi ja vea määratud faili

5 käsk 2 fail Suunab standardvea määratud faili

6 käsk 2 fail Suunab standardvea määratud failile (lisamisrežiim)

7 käsufail 2&1 Suunab standardväljundi ja vea määratud faili (manusrežiim)

8 käsk fail1 fail2 Võtab vastu sisendi esimesest failist ja saadab väljundi teisele failile

9 käsufail standardsisendina saab andmeid määratud failist

10 eraldaja käsk Võtab vastu andmeid standardsisendist kuni eraldaja leidmiseni

11 käsk &m Võtab andmed vastu failist, mille standardsisend on deskriptor m

12 käsk &m Suunab standardväljundi failideskriptorisse m

Operaator n&m võimaldab deskriptoriga n faili suunata samasse asukohta, kuhu deskriptoriga m fail. Sarnaseid operaatoreid võib käsureal olla mitu, sellisel juhul arvutatakse need vasakult paremale.

exec käsk ja failideskriptorite kasutamine

Käsk exec asendab praeguse kesta määratud käsuga. Tavaliselt kasutatakse seda praeguse tõlgi sulgemiseks ja uue tõlgi käivitamiseks. Kuid sellel on ka muid kasutusviise.

Näiteks käsk nagu

Exec-fail muudab määratud faili kõigi käskude standardsisendiks. Tehke see sisse
interaktiivsel režiimil pole mõtet - see on mõeldud kasutamiseks skriptides,
nii et kõik sellele järgnevad käsud loevad oma sisendandmed failist. Sel juhul
skripti lõpus peab olema käsk

Exec & – mis sulgeb standardse sisendvoo (antud juhul faili). Kasutatakse sarnast tehnikat
peamiselt skriptides, mis töötavad väljalogimisel.

Käsk exec on kursor failile, mille deskriptor on 0 (stdin). Seda kursorit saab taastada alles pärast skripti käitamise lõpetamist.
Kui skript kavatseb jätkata andmete lugemist klaviatuurilt, peate salvestama
kursor eelmisele sisendvoole. Allpool on lühike skript, mis näitab, kuidas seda teha.

$ cat f_desc
#!/bin/bash
exec 3&0 0-fail
loe linel
loe rida2
täitmine 0 ja 3
kaja $ 1inel
kaja $rida2

Esimene exec-käsk salvestab failideskriptoris 3 kursori standardsele sisendvoogu (stdin)
(lubatud on kõik täisarvud vahemikus 3 kuni 9) ja seejärel avab faili lugemiseks. Järgmised kaks lugemiskäsku
lugeda failist kaks rida teksti. Teine exec-käsk taastab kursori standardsisendisse: nüüd
see on seotud stdin-failiga, mitte failiga. Viimased kajakäsud kuvavad ekraanil loetud ridade sisu,
mis salvestati linel ja Iine2 muutujatesse.

Skripti tulemus:
$./f_desc
Tere!
Hüvasti!

Head aega, mu lugejad!
Selles artiklis tahan oma teadmisi süstematiseerida vastavalt põhiprintsiipidele programmivoogude ja kanalite toimimine tõlgis ja üldiselt Linux OS-is, samuti võimaluste kohta ümbersuunamised andmeid ojad.
Kohe alguses tahaksin märkida, et tõlk töötab kolme standardse vooga:

  1. stdout See standardväljund, mis annab käsu väljundi. Voo deskriptor on 1.
  2. stderr See standardne veavoog, mis prindib käsuvead. Selle deskriptor on 2.
  3. stdin See standardne sisend, mis annab käskudele sisendi. Selle deskriptor on 0.

Nüüd kirjeldame lihtsate sõnadega, mida need kolm punkti tähendavad:

stdout- standardne väljundvoog. Lihtsamalt öeldes on see teave, mida näeme interpretaatoris käskude täitmisel. See tähendab, et kõik teated (ilma veateadeteta), millest tõlgendis sooritatud käsk teatab ja terminalis (loe: ekraanil) kuvab. (Ekraani väljund on vaikimisi seatud, kuid saate määrata ka väljundi, näiteks faili või suunata teisele käsule; kuidas seda tehakse, räägin allpool)

stderr- vigade voog. Need on vead bashis käskude täitmisel, mis vaikimisi väljastatakse stdout-le, st terminalile (jällegi, kui pole määratud väljundit teise asukohta)

stdin- sisendvoog. Lihtsamalt öeldes sisestame selle käsu täitmiseks klaviatuurilt interpretaatorisse.

Need vood on väga hästi kujutatud aadressilt http://rus-linux.net/ võetud joonisel:

Sellel pildil: Roheliselt näidatud Stdinil on käepide 0
Stdout, mis on näidatud punaselt, on käepidemega 1
Sinise värviga Stderril on käepide 2

Järgmisena räägin teile, kuidas neid vooge faili juurde/failist ümber suunata. Ehk siis käsu täitmisel nii, et teateid või tõrkeid ei kuvata ekraanil, vaid need kirjutatakse faili. Milleks see mõeldud on? Näiteks täidate mõnda käsku, mille väljund ei mahu terminali aknasse. Ütlete tal salvestada standardväljund ühte faili ja standardviga teise. Seega saab salvestatud faile avades üksikasjalikult vaadata kõiki vigu ja standardväljundi vajadust.

Nii et lõime ümbersuunamine toimub järgmiselt:

$ käsk n> fail

See rida näitab: käsu täitmine käsk ja voo ümbersuunamine (kus n= voo käepide) faili faili. Kui selle ümbersuunamise sooritamisel on sihtfail olemas, siis see on olemas uuesti salvestatud. Sel juhul, kui n pole määratud, eeldatakse standardväljundit.

$ käsu n>>fail

Sellel käsul on sarnane süntaks, kuid siin on määratud sümbol ">>". Selle ümbersuunamise korral, kui sihtfail on olemas, lisatakse käsu väljund olemasolevatele andmetele.

$käsk< file

selles näites käsk käsk käivitatakse ja kasutab faili sisendallikana fail, klaviatuurisisestuse asemel

Mõnikord on vaja ühendada standardne veavoog standardse väljundvooga, et vigu ja tavalist programmiväljundit saaks koos töödelda. Nendel eesmärkidel kasutatakse kombinatsiooni sümboliga: &. Selle toimingu näide:

Otsige üles / -nimi .nimi_fail > /tee/faili 2>&1

Selle käsu täitmisel otsitakse faili nimega failisüsteemi juurtest .name_file ja otsingutulemuste (stdout ja stderr) ümbersuunamine faili /tee/failile. Disain > /tee/faili 2>&1 suunab standardväljundi ümber /tee/failile ja printimisvead standardväljundisse. See ütles: 2>&1 enne > kirjutamine ei tööta, sest kui tõlk loeb 2>&1 , ei tea ta veel, kuhu standardväljundvoog ümber suunatakse, mistõttu vea- ja väljundvooge ei liideta.

$ käsk > fail 2>&1

sarnane kirjutamisega:

$ käsk &> fail

$ käsk 2>&fail

Kui väljundit on vaja ignoreerida, saab selle suunata /dev/null seadmesse, see on omamoodi "must auk", mis võtab suvalise hulga teavet ja muudab selle eimillekski.

Arvan, et voo ümbersuunamise kohta esitatud teabest piisab olemuse mõistmiseks, nüüd räägin teile sellest konveieri ülekanne.

Torujuhe Linuxis on mitme programmi võime koos töötada, kui ühe programmi väljund kantakse otse teise programmi sisendisse ilma vahepealseid ajutisi faile kasutamata. Konveieri kasutamise süntaks on järgmine:

$käsk1 | käsk2

Selles näites täidetakse käsk käsk1, kasutatakse selle väljundvoogu täitmisel sisendvoona käsk2.

See on tänaseks kõik. Võtan hea meelega kommentaare ja täiendusi. Aitäh.

Parimate soovidega, McSim!

Käskude ümbersuunamise operaatoreid kasutatakse käsu sisend- ja väljundvoogude vaikeasukohtade muutmiseks mõnda teise asukohta. Sisend- ja väljundvoo asukohta nimetatakse käepidemeks.

Järgmises tabelis kirjeldatakse käsu sisendi ja väljundi ümbersuunamise operaatoreid.

Ümbersuunamise operaator

Kirjeldus

Kirjutab käsurea asemel käsu väljundi faili või seadmesse, näiteks printerisse.

Loeb käsu sisendvoo failist, mitte klaviatuurilt.

Lisab käsu väljundi faili lõppu, eemaldamata failist olemasolevat teavet.

Loeb ühe deskriptori väljundit teise deskriptori sisendiks.

Loeb ühe käepideme sisendit teise käepideme väljundina.

Loeb ühe käsu väljundit ja kirjutab selle teise käsu sisendisse. Seda protseduuri nimetatakse kanaliseerimiseks.

Vaikimisi saadetakse käsusisend (STDIN-käepide) klaviatuurilt käsutõlkile Cmd.exe, seejärel saadab Cmd.exe käsuväljundi (STDIN-käepide) käsuviiba aknasse.

Järgmises tabelis on näidatud saadaolevad deskriptorid.

Numbrid 0 kuni 9 tähistavad 10 esimest deskriptorit. Programmi käivitamiseks ja mis tahes kümnest käepidemest ümbersuunamiseks kasutatakse käsutõlget Cmd.exe. Vajaliku käepideme määramiseks sisestage selle number enne ümbersuunamisoperaatorit. Kui käepide pole määratletud, siis vaikimisi sisendi ümbersuunamise operaator "<» будет ноль (0), а оператором перенаправления вывода «>" on üks (1). Pärast operaatorisse sisenemist "<» или «>«Tuleb märkida, kust andmeid lugeda ja kuhu kirjutada. Saate määrata faili nime või mis tahes olemasoleva deskriptori.

Olemasolevatele käepidemetele ümbersuunamise määramiseks kasutage ampersandi (&), millele järgneb soovitud käepideme number (näiteks & käepideme_number). Näiteks käepideme 2 (STDERR) ümbersuunamiseks käepidemele 1 (STDOUT), sisestage:

Dubleerivad deskriptorid

Ümbersuunamisoperaator "&" dubleerib väljundi või sisendi ühest määratud käepidemest teise määratud käepidemesse. Näiteks käsu väljundi saatmiseks rež faili File.txt ja saatke veaväljund failile File.txt, sisestage:

dir>c:\file.txt 2>&1

Deskriptori dubleerimisel kopeeritakse kõik selle algsed omadused. Näiteks kui käepide on ainult kirjutatav, on kõik selle duplikaadid ainult kirjutatavad. Kirjutuskaitstud käepidet ei saa dubleerida kirjutuslikuks käepidemeks.

Käsu sisendi ümbersuunamine (<)

Numbriklahvistiku sisendi suunamiseks faili või seadmesse kasutage nuppu "<». Например, для ввода команды sorteerida sisestage failist List.txt:

sorteerida

Faili File.txt sisu kuvatakse käsureal tähestikulises järjekorras loendina.

Operaator"<» открывает заданное имя файла с доступом только для чтения. Поэтому с его помощью нельзя записывать в файл. Например, при запуске программы с оператором <&2 все попытки прочитать дескриптор 0 ни к чему не приведут, так как изначально он был открыт с доступом только для записи.

Märge

  • Käepide 0 on sisendi ümbersuunamise operaatori vaikeseade<».

Ümbersuunamiskäsu väljund (>)

Peaaegu kõigi käskude väljund kuvatakse käsuviiba aknas. Isegi käsud, mis väljastavad andmeid kettale või printerisse, annavad käsuviiba aknas teateid ja viipasid.

Käskude väljundi käsuviiba aknast faili või seadmesse ümbersuunamiseks kasutage operaatorit ">". Seda operaatorit kasutatakse enamiku käskudega. Näiteks käsu väljundi ümbersuunamiseks rež sisestage faili Dirlist.txt:

kataloog> kataloog.txt

Kui faili Dirlist.txt pole olemas, loob käsutõlk Cmd.exe selle. Kui fail on olemas, asendab Cmd.exe failis oleva teabe käsust saadud andmetega rež.

Käsu käivitamiseks netsh marsruutimise dump ja saates seejärel oma töö tulemused saidile Route.cfg, sisestage:

netsh marsruutimise dump>c:\route.cfg

Operaator ">" avab määratud faili ainult kirjutusõigusega. Seetõttu ei saa faili selle operaatoriga lugeda. Näiteks programmi käivitamisel ümbersuunamisoperaatoriga<&0 все попытки записать дескриптор 1 ни к чему не приведут, так как изначально дескриптор 0 был открыт с доступом только для чтения.

Märge.

  • Käepide 1 on väljundi ümbersuunamise operaatori ">" vaikeseade.

Kasutades operaatorit "<&» для перенаправления ввода и дублирования

Sisendümbersuunamisoperaatori kasutamiseks peab määratud fail juba olemas olema. Kui sisendfail on olemas, avab Cmd.exe käsutõlk selle kirjutuskaitstud juurdepääsuga ja saadab selle sisu käsule nii, nagu see oleks numbriklahvistiku sisend. Kui käepide on määratud, dubleerib käsutõlk Cmd.exe selle süsteemis olemasolevaks käepidemeks.

Näiteks faili File.txt lugemiseks sisenddeskriptorisse 0 (STDIN), sisestage:

< fail.txt

Faili File.txt avamiseks, selle sisu sorteerimiseks ja seejärel käsuviiba aknasse (STDOUT) saatmiseks tippige:

sorteerida< fail.txt

Faili File.txt leidmiseks ning pideme 1 (STDOUT) ja pideme 2 (STDERR) ümbersuunamiseks faili Search.txt sisestage:

leia fail fail.txt>otsing.txt 2<&1

Kasutaja määratud deskriptori 3 dubleerimiseks deskriptori 0 (STDIN) sisendiks sisestage:

Operaatori ">&" kasutamine sisendi ümbersuunamiseks ja dubleerimiseks

Kui suunate väljundi faili ümber ja määrate olemasoleva failinime, avab käsutõlk Cmd.exe faili ainult kirjutusõigusega ja kirjutab selle sisu üle. Kui käepide on määratud, dubleerib käsutõlk Cmd.exe faili olemasolevasse käepidemesse.

Kasutaja määratud deskriptori 3 dubleerimiseks deskriptoriks 1 sisestage:

Kogu väljundi, sealhulgas deskriptori 2 väljundi (STDERR) ümbersuunamiseks käsud ipconfig käepidemesse 1 (STDOUT) ja suunates seejärel väljundi Output.log-i, sisestage:

ipconfig.exe>>output.log 2>&1

Väljundi lisamiseks operaatori ">>" kasutamine

Käsu väljundi lisamiseks faili lõppu, ilma sellesse salvestatud teavet kaotamata, kasutage topeltmärki (>>). Näiteks lisab järgmine käsk käsuga loodud kataloogide loendi rež, faili Dirlist.txt:

dir>>dirlist.txt

Käsu väljundi lisamiseks netstat Sisestage faili Tcpinfo.txt lõppu:

netstat>>tcpinfo.txt

Kanalioperaatori kasutamine (|)

Vertikaalse joonetoru operaator (|) võtab ühe käsu väljundi (vaikimisi STDOUT) ja suunab selle teise käsu (vaikimisi STDIN) sisendisse. Näiteks sorteerib järgmine käsk kataloogi:

dir | sorteerida

Selles näites käivitatakse mõlemad käsud samaaegselt, kuid käsk sorteerida peatub, kuni käsu väljund on vastu võetud rež. Meeskond sorteerida kasutab käsuväljundit rež sisendiks ja saadab seejärel väljundi deskriptorile 1 (STDOUT).

Käskude kombineerimine ümbersuunamisoperaatoritega

Kombineerides filtrikäske teiste käskude ja failinimedega, saate luua kohandatud käske. Näiteks stringi "LOG" sisaldavate failinimede salvestamiseks kasutage järgmist käsku:

dir /b | leidke "LOG" > loglist.txt

Käsu väljund rež saadetakse filtrikäsku leida. Stringi "LOG" sisaldavad failinimed salvestatakse faili Loglist.txt loendina (nt NetshConfig.log, Logdat.svd ja Mylog.bat).

Kui ühes käsus kasutatakse rohkem kui ühte filtrit, tuleb need toru (|) abil eraldada. Näiteks otsib järgmine käsk igast draivi C kataloogist faile, mille nimes on string "Logi", ja kuvab need lehekülgede kaupa:

kataloog c:\ /s /b | leida "LOG" | rohkem

Toru (|) olemasolu näitab failile Cmd.exe, et käsk väljub rež tuleb saata filtrikäsku leida. Meeskond leida valib ainult need failinimed, mis sisaldavad stringi "LOG". Meeskond rohkem kuvab käsuga saadud failinimed leida pausiga pärast iga ekraani täitumist.