Ohjaa tulos tiedostoon. Vakiotulo-/lähtövirtojen uudelleenohjaus

1403

Uudelleenohjataan "2>&1", ">/dev/null tai ulostulovirta Unixissa (bash/sh)

Arvosanasi: mestariteos ihana erittäin hyvä hyvä normaali En ole lukenut sitä siedettävä keskinkertainen huono erittäin huono älä lue

Lähtövirrat

Komentosarjaviestit tulostetaan hyvin määriteltyihin virtoihin - lähtövirtoihin. Joten mitä tuotamme läpi

echo "Hei, maailma!"

Ei vain näy näytöllä, vaan järjestelmän ja erityisesti komentotulkkien sh ja bash näkökulmasta se tulostetaan tietyn tulostusvirran kautta. Kaiun tapauksessa virta numero 1 (stdout), johon näyttö liittyy.

Jotkut ohjelmat ja komentosarjat käyttävät myös erilaista lähtövirtaa - numero 2 (stderr). Siellä ne näyttävät virheilmoituksia. Tämä mahdollistaa säännöllisten tietojen ja virheviestien erottamisen virroista ja reitittämisen ja käsittelyn erikseen.

Voit esimerkiksi estää tiedotusviestien lähdön ja jättää vain virheilmoitukset. Tai lähetä virheilmoitukset erilliseen tiedostoon kirjaamista varten.

Mikä on "joku tiedosto"

Tämä Unixin merkintä (bash- ja sh-tulkeissa) osoittaa ulostulovirtojen uudelleenohjauksen.

Seuraavassa esimerkissä ohjaamme kaikki ls-komennon tiedottavat (tavalliset) viestit tiedostoon myfile.txt, jolloin tässä tiedostossa on vain ls-luettelo:

$ ls > omatiedosto.txt


Tässä tapauksessa Enter-näppäimen painamisen jälkeen et näe näytöllä mitään, mutta tiedosto myfile.txt sisältää kaiken, mitä näytöllä olisi pitänyt näyttää.

Tehdään kuitenkin tarkoituksella virheellinen operaatio:

$ ls /masdfasdf > omatiedosto.txt


Mitä sitten tapahtuu? Koska masdfasdf-hakemistoa ei ole tiedostojärjestelmän juurissa (oletan niin - entä jos teet?), ls-komento tuottaa virheen. Se ei kuitenkaan anna tätä virhettä tavallisen stdout-virran (1), vaan virhevirran stderr (2) kautta. Ja uudelleenohjaus on asetettu vain stdout-tiedostolle ("> omatiedosto.txt").

Koska emme ohjanneet stderr(2)-virtaa minnekään - virheilmoitus tulee näyttöön eikä näy myfile.txt-tiedostossa

Ajetaan nyt ls-komento niin, että tietotiedot kirjoitetaan tiedostoon myfile.txt ja virheilmoitukset tiedostoon myfile.err, eikä näytölle näy mitään suorituksen aikana:

$ ls >omatiedosto.txt 2>omatiedosto.err


Täällä kohtaamme ensimmäistä kertaa virran numeron osoittamisen uudelleenohjauksena. Merkintä "2>myfile.err" osoittaa, että tietovirta numero 2 (stderr) on ohjattava tiedostoon myfile.err.

Voimme tietysti ohjata molemmat streamit samaan tiedostoon tai samaan laitteeseen.

2>&1

Voit usein löytää tällaisen merkinnän skripteistä. Se tarkoittaa: "Ohjaa stream numero 2 streamiin 1" tai "Stream stderr - uudelleenohjaus streamin stdoutin kautta". Ne. Reititämme kaikki virheilmoitukset sen säikeen läpi, jonka kautta normaalit, ei-virheilmoitukset yleensä tulostetaan.

$ ls /asfasdf 2>&1


Tässä on toinen esimerkki, jossa kaikki viestit ohjataan tiedostoon myfile.txt:

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


Tässä tapauksessa kaikki viestit, sekä virhe- että normaalit, kirjoitetaan tiedostoon myfile.txt, koska Ensin ohjasimme stdout-virran tiedostoon ja osoitimme sitten, että virheet tulisi upottaa stdout-tiedostoon - vastaavasti tiedostoon myfile.txt

/dev/null

Joskus meidän on kuitenkin vain piilotettava kaikki viestit - tallentamatta niitä. Ne. vain estä ulostulo. Tähän käytetään virtuaalilaitetta /dev/null. Seuraavassa esimerkissä ohjaamme kaikki tavalliset viestit ls-komennosta hakemistoon /dev/null:

$ ls > /dev/null


Näytölle ei tule mitään muuta kuin virheilmoituksia. Ja seuraavassa esimerkissä virheilmoitukset estetään:

$ ls > /dev/null 2>&1


Lisäksi tämä tietue vastaa muotoa:

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


Ja seuraavassa esimerkissä estämme vain virheilmoitukset:

$ ls 2>/dev/null

Huomaa, että et voi enää määrittää "2>&1" tässä, koska virtaa (1) ei ohjata minnekään ja tässä tapauksessa virheilmoitukset ilmestyvät näytölle.

Mikä tulee ensin - muna vai kana?

Annan sinulle 2 esimerkkiä tässä.

Esimerkki 1)

$ ls >/dev/null 2>&1


Esimerkki 2)

$ ls 2>&1 >/dev/null


Ulkonäöltään summa ei muutu tavujen paikkoja järjestämällä. Mutta uudelleenohjausosoittimien järjestyksellä on väliä!

Asia on siinä, että tulkit lukevat ja käyttävät uudelleenohjauksia vasemmalta oikealle. Ja nyt tarkastellaan molempia esimerkkejä.

Esimerkki 1

1) ">/dev/null" - ohjaamme virran 1 (stdout) hakemistoon /dev/null. Kaikki streamiin (1) tulevat viestit lähetetään osoitteeseen /dev/null.

2) "2>&1" - ohjaamme virran 2 (stderr) streamiin 1 (stdout). Mutta koska säie 1 on jo liitetty hakemistoon /dev/null - kaikki viestit päätyvät silti kansioon /dev/null.

Tulos: näyttö on tyhjä.

Esimerkki 2

1) "2>&1" - ohjaamme virhevirran stderr (2) stdout-virtaan (1). Samalla, koska säie 1 liittyy oletusarvoisesti päätteeseen - näemme onnistuneesti virheilmoitukset näytöllä.

2) ">/dev/null" - ja tässä ohjaamme säiettä 1 kohtaan /dev/null. Emmekä näe tavallisia viestejä.

Tulos: Näemme virheilmoituksia näytöllä, mutta emme näe normaaleja viestejä.

Johtopäätös: ohjaa stream ensin uudelleen ja linkitä sitten siihen.

Vaikka ohjelmat käsittelevät tavallisesti I/O:n vakiovirtoja, kuten todettiin, komentotulkissa on erityiset toiminnot I/O:n uudelleenohjausta varten.

5.5.1 Operaattorit >,< и >>

Symboleja " käytetään osoittamaan uudelleenohjaus > ", "< "ja" >> ". Yleisin käyttö on ohjata komennon ulostulo tiedostoon. Tässä on esimerkki:

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

Tämä komento tallentaa tiedostoon /home/jim/dir.txt luettelon sen hakemiston tiedostoista ja alihakemistoista, jotka olivat voimassa komennon suoritushetkellä. ls; Lisäksi, jos määritettyä tiedostoa ei ollut olemassa, se luodaan; jos se oli olemassa, se korvataan; jos haluat komennon tulosteen liitettävän olemassa olevan tiedoston loppuun, niin tarvitsemasi symbolin sijaan > käyttää >> . Tässä tapauksessa välilyönnit merkkien edessä tai jälkeen > tai >> on merkityksetön ja palvelee vain käyttäjän mukavuutta.

Voit lähettää tulosteen paitsi tiedostoon myös toisen komennon tuloon tai laitteeseen (kuten tulostimeen). Joten voit laskea sanojen määrän /home/jim/report.txt-tiedostossa käyttämällä seuraavaa komentoa:

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

ja tulostaa tiedosto käyttämällä komentoa:

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

Kuten näette, operaattori > ohjaa lähtövirran uudelleen. Suhteessa tulovirtaan operaattori suorittaa samanlaisen toiminnon < . Yllä oleva esimerkkikomento tietyn tiedoston sanojen määrän laskemiseksi voidaan kirjoittaa uudelleen seuraavasti (huomaa komennon puuttuminen kissa):

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

Tätä uudelleenohjausvaihtoehtoa käytetään usein erilaisissa komentosarjoissa, jotka tyypillisesti hyväksyvät (tai odottavat) näppäimistön syötteen. Joitakin rutiinitoimintoja automatisoivassa komentosarjassa voit antaa komennon tarvittavat tiedot tiedostosta, johon on tallennettu valmiiksi se, mitä tämän komennon suorittamiseksi on syötettävä.

Johtuen siitä, että symbolit < , > Ja >> toimimaan vakiovirroilla, niitä voidaan käyttää paitsi tavalliseen tapaan, kuten yleensä tehdään, myös hieman eri tavalla. Joten seuraavat komennot ovat vastaavia:

$ cat > tiedosto

$cat>tiedosto

$ > tiedostokissa

$ > tiedosto cat

Kuitenkaan sellaisenaan (ilman komentoa, jolle on määritelty vakiovirrat) uudelleenohjaussymbolia ei voi käyttää, joten sitä ei voi käyttää esim. kirjoittamalla

$tiedosto1 > tiedosto2

saada kopio tiedostosta. Mutta tämä ei vähennä tämän mekanismin merkitystä, koska vakiosäikeet on määritelty mille tahansa komennolle. Tässä tapauksessa voit uudelleenohjata vakiotulon ja -tulosteen lisäksi myös muita virtoja. Voit tehdä tämän määrittämällä uudelleenohjatun virran numeron ennen uudelleenohjaussymbolia. Vakiotulon stdin on numero 0, vakiotulosteen stdout on numero 1, vakiovirhevirran stderr on numero 2. Eli uudelleenohjauskomennon koko muoto on (muista, että välilyönnit lähellä > ovat valinnaisia):

komento N>M

Jossa N Ja M— vakiovirtojen lukumäärä (0,1,2) tai tiedostonimet. Symbolien käyttö joissakin tapauksissa < , > Ja >> ilman kanavanumeron tai tiedoston nimen määrittämistä on mahdollista vain koska 1 korvataan oletusarvoisesti puuttuvan numeron, eli vakiolähdön, tilalla. Kyllä, operaattori > numeroa määrittelemättä tulkitaan 1 > .

Sen lisäksi, että yksinkertaisesti uudelleenohjataan vakiovirtauksia, on myös mahdollista paitsi ohjata streamia yhdelle tai toiselle kanavalle, myös tehdä kopio vakiovirran sisällöstä. Tätä varten on erityinen symboli & , joka sijoitetaan sen kanavanumeron eteen, johon suoratoisto uudelleenohjataan:

komento N > &M

Tämä komento tarkoittaa, että ulostulo kanavan numero N lähetetään sekä vakiolähtöön että kopioidaan kanavanumeroon M. Esimerkiksi, jotta virheilmoitukset kopioidaan vakiolähtöön, sinun on annettava komento 2>&1, samalla kun 1>&2 kopioi stdoutista stderriin. Tämä ominaisuus on erityisen hyödyllinen ohjattaessa tulostetta tiedostoon, koska silloin näemme viestit näytöllä ja tallennamme ne tiedostoon.

5.5.2 Käyttäjä |

Erityinen vaihtoehto lähdön uudelleenohjaukselle on ohjelmistokanava (jota joskus kutsutaan putkeksi tai kuljettimeksi). Tätä varten kaksi tai useampi komento, jolloin edellisen tulos toimii seuraavan tulona, ​​yhdistetään (tai erotetaan halutessasi) pystypalkkimerkillä - "|". Tässä tapauksessa komennon standardilähtövirta, joka sijaitsee symbolin vasemmalla puolella | , lähetetään ohjelman vakiosyötteeseen, joka sijaitsee symbolin oikealla puolella | . Esimerkiksi:

$ cat myfile | grep Linux | wc -l

Tämä rivi tarkoittaa, että komennon tulos on kissa, eli teksti tiedostosta myfile, lähetetään komentosyöttöön grep, joka korostaa vain rivit, jotka sisältävät sanan "Linux". Komentolähtö grep ohjataan puolestaan ​​komentosyöttöön wc -l, joka laskee tällaisten rivien määrän.

Ohjelmaputkia käytetään yhdistämään useita pieniä ohjelmia, joista jokainen suorittaa vain tiettyjä muunnoksia tulovirrassaan, luodakseen yleisen käskyn, joka johtaa monimutkaisempiin muunnoksiin.

On huomattava, että komentotulkki kutsuu samanaikaisesti kaikkia liukuhihnaan sisältyviä komentoja suoritettavaksi ja käynnistää erillisen komentotulkin esiintymän jokaiselle komennolle, joten heti kun ensimmäinen ohjelma alkaa tuottaa jotain tulosvirtaansa, seuraava komento alkaa käsitellä sitä. Samalla tavalla jokainen seuraava komento suorittaa oman toimintonsa odottaen dataa edellisestä komennosta ja tuottaen tulokset seuraavan komennon syötteenä. Jos haluat komennon valmistuvan kokonaan ennen seuraavan alkamista, voit käyttää sitä yhdellä rivillä liukuviivasymbolina | , ja puolipiste ; . Ennen jokaista puolipistettä kuori pysähtyy ja odottaa, että kaikki liukuhihnaan sisältyvät aiemmat komennot suorittavat suorituksen loppuun.

Putken poistumistila (ohjelman päättymisen jälkeen palautettu looginen arvo) on sama kuin liukuhihnan viimeisen komennon palauttama poistumistila. Voit laittaa "!"-symbolin liukuhihnan ensimmäisen komennon eteen, jolloin liukuhihnan poistumistila on viimeisen komennon poistumistilan looginen negaatio. Shell odottaa, että kaikki liukuhihnakomennot ovat valmiit ennen palautusarvon määrittämistä.

5.5.3 Suodattimet

Viimeinen esimerkki yllä (komennolla grep) voidaan käyttää havainnollistamaan toista tärkeää käsitettä, nimittäin suodatinohjelmaa. Suodattimet ovat komentoja (tai ohjelmia), jotka ottavat syötetyn datavirran, suorittavat siihen joitain muunnoksia ja tulostavat tuloksen vakiolähtöön (josta se voidaan ohjata muualle käyttäjän harkinnan mukaan). Suodatinkomennot sisältävät jo edellä mainitut komennot kissa, enemmän, vähemmän, wc, cmp, ero, sekä seuraavat komennot.

Taulukko 5.1. Suodatuskomennot

Joukkue

Lyhyt kuvaus

grep, fgrep, egrep

Etsii syötetiedostosta tai vakiosyötteestä määritetyn kuvion sisältäviä rivejä ja kirjoittaa ne vakiotulosteeseen

Korvaa kaikki syötevirran merkit, jotka on lueteltu annetussa luettelossa, vastaavilla merkeillä toisesta määritetystä luettelosta

comm

Vertaa kahta tiedostoa rivi riviltä ja tulostaa 3 saraketta vakiotulosteeseen: yksi sisältää rivejä, jotka esiintyvät vain yhdessä tiedostossa, toinen sisältää rivejä, jotka esiintyvät vain toisessa tiedostossa: ja kolmas sisältää rivit, jotka esiintyvät molemmissa tiedostoissa

Muotoilee tekstitiedoston tai vakiosyötteen sisällön tulostusta varten

sed

Merkkijonoeditori, jota käytetään suorittamaan joitain muunnoksia syöttötietovirralle (otettu tiedostosta tai vakiosyötteestä)

Erityinen suodatin on komento tee, joka "jakaa" syöttövirran ohjaten sen toiselta puolelta standardilähtöön ja toisaalta tiedostoon (jonka nimi on määritettävä). On helppo nähdä, että toiminnallaan komento tee samanlainen kuin uudelleenohjausoperaattori 1>&tiedosto.

Suodattimien ominaisuuksia voidaan laajentaa merkittävästi käyttämällä säännöllisiä lausekkeita, joiden avulla voit järjestää esimerkiksi haun käyttämällä erilaisia, usein hyvin monimutkaisia ​​​​malleja.

Uudelleenohjauksesta ja suodattimista voitaisiin sanoa paljon. Mutta tämä materiaali on saatavilla useimmissa UNIX- ja Linux-kirjoissa, esimerkiksi Petersen [P1.4] ja Kelly-Bootle [P1.8]. Siksi rajoitamme vain sanomaan ja siirrymme tarkastelemaan niin sanottua ympäristöä tai kuoren luomaa ympäristöä.

V. Kostromin (kos at rus-linux pisteverkko) - 5.5. I/O-uudelleenohjaus, kanavat ja suodattimet

Mikä tahansa ohjelma on "automaattinen kone", joka on suunniteltu käsittelemään tietoja: vastaanottaessaan yhden tiedon syötteenä se tuottaa toisen työn tuloksena. Vaikka saapuva ja/tai lähtevä informaatio voi olla nolla, toisin sanoen yksinkertaisesti poissa. Ohjelmalle prosessoitavaksi siirrettävä tieto on sen syöttö, mitä se työnsä tuloksena tuottaa, on sen tulos. Jokaisen ohjelman syötteiden ja tulosteiden järjestäminen on käyttöjärjestelmän tehtävä.

Jokainen ohjelma toimii tietyn tyyppisten tietojen kanssa: teksti, grafiikka, ääni jne. Kuten luultavasti on jo käynyt selväksi, Linuxin pääjärjestelmänhallintaliittymä on pääte, joka on suunniteltu siirtämään tekstitietoja käyttäjältä järjestelmään ja takaisin. Koska päätelaitteesta voidaan syöttää ja tulostaa vain tekstiinformaatiota, myös päätteeseen liittyvien ohjelmien tulon ja lähdön on oltava tekstiä. Tarve toimia tekstidatan kanssa ei kuitenkaan rajoita järjestelmän hallintaominaisuuksia, vaan päinvastoin laajentaa niitä. Ihminen voi lukea minkä tahansa ohjelman tulosteen ja selvittää, mitä järjestelmässä tapahtuu, ja eri ohjelmat osoittautuvat keskenään yhteensopiviksi, koska ne käyttävät samantyyppistä tiedon esitystapaa - tekstiä.

Komennot ja komentosarjat voivat vastaanottaa syötteitä kahdella tavalla: vakiosyötteestä (linkitetty näppäimistöön) tai tiedostosta. Samanlainen erottelu on olemassa tulosteille: komennon tai komentosarjan tulos lähetetään oletuksena päätenäytölle, mutta voit ohjata sen uudelleen tiedostoon. Jos käytön aikana tapahtuu virheitä. Niitä koskevat viestit näkyvät myös näytöllä, ja virhevirta voidaan myös ohjata tiedostoon.

Katsotaanpa ensin pari komentoa, joita voidaan käyttää I/O:n järjestämiseen.

Lähtökomennot vakiolähtölaitteeseen

Linux tarjoaa useita komentoja viestien tulostamiseksi vakiotulostukseen:

  • echo - Tulosta merkkijono vakiotulosteeseen.
  • printf - Tulosta muotoiltu teksti vakiotulostukseen.
  • kyllä ​​- Tulosta toistuva teksti vakiotulosteeseen.
  • seq - Tulosta numerosarja vakiotulostukseen
  • Clear Tyhjennä näyttö tai ikkuna.

Jos esimerkiksi käytät echo-komentoa, jos määrität ohjausmerkin \c, silloin kun tulos on valmis, uudelle riville ei siirrytä:

$ echo "Mikä on nimesi?\c"

Mikä sinun nimesi on? $

Tässä $ on kutsusymboli.

Rivi voi myös laskea kuorimuuttujien ja jopa muiden komentojen arvot. Esimerkiksi seuraava komento kertoo, mikä nykyisen käyttäjän kotihakemisto on ($HOME-ympäristömuuttuja) ja mihin päätteeseen hän on yhteydessä (tty-komento on takalainausmerkkien sisällä, jotta tulkki laittaa tulosteen riville).

$ echo "Kotihakemistosi on $HOME, olet yhteydessä terminaaliin - `tty` "

Kotihakemistosi on /home/knoppix, olet yhteydessä päätteeseen - /dev/tty1

Koska kaksoislainausmerkeillä on erityinen tarkoitus komentotulkissa, jotta voit sisällyttää kaksoislainausmerkkejä tulostemerkkijonoon, sinun on kumottava niiden erikoistarkoitus kenoviivalla (\). Tämä peruuttaa minkä tahansa erikoismerkin määrityksen.

Esimerkiksi merkkijonon "/dev/tty1" näyttämiseksi sinun on suoritettava:

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

Syötä komennot tavallisesta syöttölaitteesta

Read-komento lukee yhden rivin vakiosyötteestä ja kirjoittaa sen sisällön määritettyihin muuttujiin. Kun määritetään useita muuttujia, ensimmäinen sana kirjoitetaan ensimmäiseen, toinen sana toiseen jne. viimeinen sisältää loput rivistä.

Seuraava komentosarja kutsuu erillisen lukukomennon jokaisen muuttujan lukemiseksi.


$ kissan testi
#!/bin/bash
echo "Nimi: \c"
lue nimi
echo "Sukunimi: \c"
lue sukunimi
echo “Etunimi=” $nimi “Sukunimi=” $sukunimi

Tämän skriptin suorittamiseksi sinun on annettava testitiedostolle suoritusoikeus: chmod 0755 test ja suoritettava se./test.

Teloituksen tulos: Etunimi: Ivan Sukunimi: Petrov Etunimi=Ivan Sukunimi=Petrov

STANDARDIN TULO-, LÄHTÖ- JA VIRHETILA

Jokainen komentotulkin käynnistämä ohjelma vastaanottaa kolme avointa I/O-virtaa:

Vakiotulo (sldin) - vakiolähtö (sldout) - vakiovirhelähtö (stderr)

Oletusarvoisesti nämä säikeet liittyvät terminaaliin. Ne. Kaikki ohjelmat, jotka eivät käytä muita kuin vakiovirtoja, odottavat syötettä päätteen näppäimistöltä, mukaan lukien virheilmoitukset.

Lisäksi jokaiseen komentotulkkiin suoritettuun prosessiin (komento, komentosarja jne.) liittyy useita avoimia tiedostoja, joista prosessi voi lukea tietojaan ja joihin se voi kirjoittaa sen. Jokainen näistä tiedostoista tunnistetaan numerolla, jota kutsutaan tiedostokuvaajaksi, mutta kolme ensimmäistä tiedostoa ovat oletusarvoisia I/O-virtoja:
Tiedoston kuvaus
Vakiosyöttövirta 0
Vakiolähtö 1

Normaali virhevirta 2

Todellisuudessa luodaan 12 avointa tiedostoa, mutta tiedostot, joiden kuvaajat ovat 0, 1 ja 2, on varattu vakiosyötölle, -tulostukselle ja virheille. Käyttäjät voivat myös käsitellä tiedostoja, joiden tiedostokuvaajat ovat 3–9 (varattu).

Vakiotulostetiedostossa (stdout) on kahva 1. Kaikki prosessin tulosteet kirjoitetaan tähän tiedostoon. Oletusarvoisesti tiedot tulostetaan päätenäytölle (device/dev/tty), mutta ne voidaan myös ohjata uudelleen tiedostoon tai ohjata toiseen prosessiin.

Vakiovirhevirran (siderr) tiedostolla on kuvaaja 2. Komennon suorittamisen aikana ilmenevät virheilmoitukset kirjoitetaan tähän tiedostoon. Oletusarvoisesti virheilmoitukset tulostetaan päätenäytölle (laite /dev/tty), mutta ne voidaan myös ohjata tiedostoon. Miksi lokivirheitä varten varataan erityinen tiedosto? Tosiasia on, että tämä on erittäin kätevä tapa eristää todelliset lähtötiedot komennon työn tuloksista sekä hyvä tilaisuus järjestää tehokkaasti erilaisten lokitiedostojen ylläpito.

Suuri määrä apuohjelmia käyttää vain vakiovirtoja. Tällaisissa ohjelmissa komentotulkki mahdollistaa I/O-virtojen uudelleenohjauksen itsenäisesti. Voit esimerkiksi estää virheilmoitukset, asettaa syötteen tai tulosteen tiedostosta.

Ne. Kun kutsut komentoja, voit määrittää, mihin tulo tulee vastaanottaa ja mihin lähtö lähetetään, sekä virheilmoitukset. Oletuksena, ellei toisin mainita, työskentely päätelaitteen kanssa oletetaan: tiedot syötetään näppäimistöltä ja näytetään näytöllä. Mutta shell-tulkkissa on uudelleenohjausmekanismi, joka mahdollistaa standardivirtojen liittämisen eri tiedostoihin. Tässä tapauksessa vakiovirhevirtaa ohjattaessa on määritettävä tiedostokuvaaja (2). Tämä ei ole tarpeen tulo- ja lähtövirroille.

Hyödyllinen erikoistapaus säikeen uudelleenohjausmekanismin käyttämiselle on uudelleenohjaus hakemistoon /dev/null, jonka avulla voit päästä eroon tarpeettomista viesteistä näytöllä. Voit luoda tyhjiä tiedostoja samalla mekanismilla:

% cat myfile - luo tyhjän tiedoston myfile nykyiseen hakemistoon.

/dev/null on erityinen tiedosto, joka on ns. "tyhjä laite" Siihen kirjoittaminen onnistuu "tallennettujen" tietojen määrästä riippumatta. Lukeminen tiedostosta /dev/null vastaa tiedoston EOF lopun lukemista.

I/O-virtojen uudelleenohjaus suoritetaan, kuten DOS (tarkemmin sanottuna DOS-käyttöjärjestelmä otti syntaksin virtojen uudelleenohjaukseen UNIXista) käyttämällä symboleja:

- Ohjaa vakiolähtövirta
- vakiolähtövirran uudelleenohjaus append-tilassa
- Ohjaa vakiosyöttövirta
- vastaanottaa tietoja vakiosyötteestä, kunnes erotin havaitaan

Toisin kuin DOS, luotaessa ohjelmakanavaa kahden prosessin välille UNIX/Linux-käyttöjärjestelmä käynnistää molemmat prosessit samanaikaisesti ja siirtää tiedot järjestelmäpuskurin kautta (ilman välitallennusta kiintolevylle). Näin ollen UNIX/Linux-käyttöjärjestelmän ohjelmistokanavat ovat erittäin tehokas tapa vaihtaa. Jos järjestelmäpuskuri vuotaa yli (esimerkiksi jos "lähettävä" ohjelma lähettää tiedot kanavalle nopeammin kuin "vastaanottava" ohjelma pystyy käsittelemään sen), käyttöjärjestelmä keskeyttää automaattisesti prosessin, joka kirjoittaa kanavalle, kunnes puskuri on vapautettu.

Yleisimmät uudelleenohjausoperaattorit

Nro Syntaksikuvaus
1 komentotiedosto Ohjaa vakiotulosteen uuteen tiedostoon

2 komento 1 tiedosto Ohjaa vakiotulosteen määritettyyn tiedostoon

3 tiedostokomento Ohjaa vakiotulosteen määritettyyn tiedostoon (lisäystila)

4 komentotiedosto 2&1 Ohjaa vakiotulosteen ja virheet määritettyyn tiedostoon

5 komento 2 tiedosto Ohjaa vakiovirheen määritettyyn tiedostoon

6 komento 2 tiedosto Ohjaa vakiovirheen määritettyyn tiedostoon (liittämistila)

7 komentotiedosto 2&1 Ohjaa vakiolähdön ja virheen määritettyyn tiedostoon (liittämistila)

8 komento tiedosto1 tiedosto2 Vastaanottaa syötteen ensimmäisestä tiedostosta ja lähettää tulosteen toiseen tiedostoon

9 komentotiedosto vakiosyötteenä vastaanottaa tiedot määritetystä tiedostosta

10 erotinkomento Vastaanottaa tiedot vakiosyötteestä, kunnes erotin havaitaan

11 komento &m Vastaanottaa tiedot tiedostosta, jonka vakiosyötteenä on kuvaaja m

12 komento &m Ohjaa vakiotulosteen tiedostokuvaajaan m

n&m-operaattori sallii tiedoston, jonka kuvaaja on n, uudelleenohjauksen samaan paikkaan kuin tiedosto, jonka kuvaaja on m. Komentorivillä voi olla useita samanlaisia ​​operaattoreita, jolloin ne lasketaan vasemmalta oikealle.

exec-komento ja tiedostokuvaajat

Exec-komento korvaa nykyisen komentotulkin määritetyllä komennolla. Yleensä sitä käytetään sulkemaan nykyinen tulkki ja käynnistämään toinen. Mutta sillä on myös muita käyttötarkoituksia.

Esimerkiksi komento kuten

Exec-tiedosto tekee määritetystä tiedostosta kaikkien komentojen vakiosyötteen. Suorita se sisään
interaktiivisessa tilassa ei ole järkeä - se on tarkoitettu käytettäväksi skripteissä,
niin, että kaikki sen jälkeen tulevat komennot lukevat syötetietonsa tiedostosta. Tässä tapauksessa
komentosarjan lopussa on oltava komento

Exec & – joka sulkee vakiosyöttövirran (tässä tapauksessa tiedoston). Samanlaista tekniikkaa käytetään
pääasiassa komentosarjoissa, jotka suoritetaan, kun kirjaudut ulos.

Exec-komento on osoitin tiedostoon, jonka kuvaaja on 0 (stdin). Tämä osoitin voidaan palauttaa vasta, kun komentosarja on suoritettu.
Jos komentosarja aikoo jatkaa tietojen lukemista näppäimistöltä, sinun on tallennettava
osoitin edelliseen tulovirtaan. Alla on lyhyt käsikirjoitus, joka osoittaa, kuinka tämä tehdään.

$ cat f_desc
#!/bin/bash
exec 3&0 0 -tiedosto
lue linel
lue rivi 2
suoritus 0&3
echo $1inel
echo $line2

Ensimmäinen exec-komento tallentaa osoittimen vakiosyötteeseen (stdin) tiedostokuvaajaan 3
(mikä tahansa kokonaisluku väliltä 3 ja 9 on sallittu) ja avaa sitten tiedoston lukemista varten. Kaksi seuraavaa lukukomentoa
lukea kaksi riviä tekstiä tiedostosta. Toinen exec-komento palauttaa osoittimen vakiosyötteeseen: now
se liittyy stdin-tiedostoon, ei tiedostoon. Viimeiset kaikukomennot näyttävät lukurivien sisällön näytöllä,
jotka tallennettiin linel- ja Iine2-muuttujiin.

Käsikirjoituksen tulos:
$./f_desc
Hei!
Heippa!

Hyvää aikaa lukijani!
Tässä artikkelissa haluan systematisoida tietoni perusperiaatteiden mukaisesti ohjelmavirtojen ja kanavien toiminta tulkissa ja yleensä Linux-käyttöjärjestelmässä sekä mahdollisuuksista uudelleenohjaukset tiedot purot.
Aivan alussa haluaisin huomauttaa, että tulkki toimii kolmen vakiovirran kanssa:

  1. stdout Tämä vakiolähtö, joka tarjoaa komennon tulosteen. Virran kuvaaja on 1.
  2. stderr Tämä normaali virhevirta, joka tulostaa komentovirheet. Sen kuvaaja on 2.
  3. stdin Tämä vakiotulo, joka syöttää komentoja. Sen kuvaaja on 0.

Kuvataan nyt yksinkertaisin sanoin, mitä nämä kolme kohtaa tarkoittavat:

stdout- vakiolähtövirta. Yksinkertaisesti sanottuna tämä on tieto, jonka näemme tulkissa suoritettaessa komentoja. Eli kaikki viestit (ilman virheilmoituksia), jotka tulkissa suoritettu komento raportoi ja näyttää päätteellä (lue: näytöllä). (tulostus näytölle on asetettu oletusarvoisesti, mutta voit myös määrittää tulosteen esimerkiksi tiedostoon tai ohjata toiseen komentoon; kerron kuinka tämä tehdään alla)

stderr- virhevirta. Nämä ovat virheitä suoritettaessa komentoja bashissa, jotka oletusarvoisesti lähetetään stdoutiin eli päätteeseen (jälleen, ellei lähtöä ole määritetty toiseen paikkaan)

stdin- tulovirta. Tämä on yksinkertaisesti sanottuna se, mitä syötämme näppäimistöltä tulkkiin suorittaaksemme komennon.

Nämä virrat on kuvattu erittäin hyvin kuvassa, joka on otettu osoitteesta http://rus-linux.net/:

Tässä kuvassa: Vihreällä näkyvässä Stdinissä on kahva 0
Stdout, joka näkyy punaisella, on kahva 1
Sinisellä näkyvässä Stderrissä on kahva 2

Seuraavaksi kerron sinulle, kuinka nämä streamit voidaan ohjata tiedostoon tai tiedostosta. Eli komentoa suoritettaessa niin, että viestit tai virheet eivät näy näytöllä, vaan ne kirjoitetaan tiedostoon. Mitä varten tämä on? No, esimerkiksi suoritat jotain komentoa, jonka tulos ei mahdu pääteikkunaan. Kerrot sen tallentamaan vakiotulosteen yhteen tiedostoon ja vakiovirheen toiseen. Siten kaikki virheet ja jos standarditulostusta tarvitaan, voit tarkastella yksityiskohtaisesti avaamalla tallennetut tiedostot.

Eli ketjun uudelleenohjaus tehdään näin:

$-komento n>tiedosto

Tämä rivi näyttää: komennon suoritus komento ja virtauksen uudelleenohjaus (jos n= stream-kahva) tiedostoon tiedosto. Kun suoritat tämän uudelleenohjauksen, jos kohdetiedosto on olemassa, se tulee olemaan päällekirjoitettu. Tässä tapauksessa, jos n:ää ei ole määritetty, oletetaan vakiolähtö.

$-komento n>>tiedosto

Tällä komennolla on samanlainen syntaksi, mutta tässä on määritetty ">>"-symboli. Tällä uudelleenohjauksella, jos kohdetiedosto on olemassa, komennon tulos liitetään olemassa oleviin tietoihin.

$komento< file

tässä esimerkissä komento komento suoritetaan ja käyttää tiedostoa syöttölähteenä tiedosto, näppäimistön sijaan

Joskus tulee tarpeelliseksi yhdistää standardivirhevirta vakiolähtövirtaan, jotta virheet ja normaali ohjelman tulos voidaan käsitellä yhdessä. Näihin tarkoituksiin käytetään yhdistelmää symbolin kanssa: &. Esimerkki tästä toiminnasta:

Etsi / -nimi .name_file > /polku/tiedostoon 2>&1

Kun tämä komento suoritetaan, tiedostoa etsitään tiedostojärjestelmän juuresta nimellä .name_file ja hakutulosten (stdout ja stderr) uudelleenohjaaminen tiedostoon /polku/tiedostoon. Design > /polku/tiedostoon 2>&1 ohjaa vakiotulosteen kohteeseen /polku/tiedostoon ja tulostusvirheet vakiotulostukseen. Tästä huolimatta: 2>&1:n kirjoittaminen ennen > ei toimi, koska tulkki lukeessaan 2>&1 ei vielä tiedä minne vakiolähtövirta ohjataan, joten virhe- ja lähtövirtaa ei yhdistetä.

$ komento > tiedosto 2>&1

samanlainen kuin kirjoittaminen:

$ komento &> tiedosto

$-komento 2>&tiedosto

Jos tulos on jätettävä huomiotta, se voidaan ohjata /dev/null-laitteeseen, tämä on eräänlainen "musta aukko", joka ottaa minkä tahansa määrän tietoa ja muuttaa sen tyhjäksi.

Luulen, että virtauksen uudelleenohjauksesta annetut tiedot riittävät ymmärtämään olemuksen, nyt kerron siitä kuljettimen siirto.

Putkilinja Linuxissa on useiden ohjelmien kyky toimia yhdessä, kun yhden ohjelman tulos siirretään suoraan toisen tuloon ilman väliaikaisia ​​väliaikaistiedostoja. Liukuhihnan käytön syntaksi on seuraava:

$komento1 | komento2

Tässä esimerkissä komento suoritetaan komento1, sen lähtövirtaa käytetään tulovirtana suoritettaessa komento2.

Siinä kaikki tälle päivälle. Otan mielelläni kommentteja ja lisäyksiä vastaan. Kiitos.

Ystävällisin terveisin, McSim!

Komennon uudelleenohjausoperaattoreita käytetään muuttamaan komentotulo- ja lähtövirtojen oletussijaintia johonkin muuhun paikkaan. Tulo- ja lähtövirran sijaintia kutsutaan kahvaksi.

Seuraavassa taulukossa kuvataan komentojen syötteen ja lähdön uudelleenohjausoperaattorit.

Uudelleenohjausoperaattori

Kuvaus

Kirjoittaa komennon tulosteen komentorivin sijaan tiedostoon tai laitteeseen, kuten tulostimeen.

Lukee komennon syöttövirran tiedostosta näppäimistön sijaan.

Liittää komennon tulosteen tiedoston loppuun poistamatta olemassa olevia tietoja tiedostosta.

Lukee yhden kuvaajan tulosteen syötteenä toiselle kuvaajalle.

Lukee yhden kahvan syötteen toisen kahvan ulostulona.

Lukee yhden komennon lähdön ja kirjoittaa sen toisen komennon tuloon. Tämä menettely tunnetaan kanavointina.

Oletusarvoisesti komentosyöttö (STDIN-kahva) lähetetään näppäimistöltä komentokulkkiin Cmd.exe, jonka jälkeen Cmd.exe lähettää komentotulosteen (STDOUT-kahva) komentokehoteikkunaan.

Seuraava taulukko näyttää käytettävissä olevat kuvaukset.

Numerot 0-9 edustavat 10 ensimmäistä kuvaajaa. Cmd.exe-komentotulkkia käytetään ohjelman suorittamiseen ja minkä tahansa 10 kahvan uudelleenohjaamiseen. Määritä tarvittava kahva kirjoittamalla sen numero ennen uudelleenohjausoperaattoria. Jos kahvaa ei ole määritetty, oletuksena syötteen uudelleenohjausoperaattori "<» будет ноль (0), а оператором перенаправления вывода «>" on yksi (1). Kun olet saapunut operaattoriin"<» или «>"On välttämätöntä ilmoittaa, missä tietoja luetaan ja mihin kirjoitetaan. Voit määrittää tiedostonimen tai minkä tahansa olemassa olevista kuvauksista.

Jos haluat määrittää uudelleenohjauksen olemassa oleviin kahvoihin, käytä et-merkkiä (&) ja sen jälkeen halutun kahvan numeroa (esim. & kahvan_numero). Jos esimerkiksi haluat ohjata kahvan 2 (STDERR) kahvaan 1 (STDOUT), kirjoita:

Päällekkäiset kuvaukset

Uudelleenohjausoperaattori "&" kopioi tulosteen tai syötteen yhdestä määritetystä kahvasta toiseen määritettyyn kahvaan. Esimerkiksi komentotulosteen lähettämiseen ohj tiedostoon File.txt ja lähetä virhetuloste File.txt-tiedostoon, kirjoita:

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

Kuvaajaa kopioitaessa kaikki sen alkuperäiset ominaisuudet kopioidaan. Jos esimerkiksi kahva on vain kirjoitus, kaikki sen kaksoiskappaleet ovat vain kirjoituskelpoisia. Et voi kopioida vain luku -kahvaa vain kirjoituskahvaksi.

Komentosyöttö uudelleenohjaus (<)

Voit ohjata numeronäppäimistön komennot tiedostoon tai laitteeseen käyttämällä "<». Например, для ввода команды järjestellä kirjoita List.txt-tiedostosta:

järjestellä

Tiedosto.txt-tiedoston sisältö näkyy komentorivillä luettelona aakkosjärjestyksessä.

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

Huom

  • Kahva 0 on syötteen uudelleenohjausoperaattorin oletusarvo<».

Uudelleenohjauskomennon lähtö (>)

Lähes kaikkien komentojen tulos näkyy komentokehoteikkunassa. Jopa komennot, jotka tulostavat tietoja levylle tai tulostimeen, tuottavat viestejä ja kehotteita Komentorivi-ikkunassa.

Voit ohjata komentojen tulosteet komentokehoteikkunasta tiedostoon tai laitteeseen käyttämällä ">"-operaattoria. Tätä operaattoria käytetään useimpien komentojen kanssa. Esimerkiksi ohjata komennon ulostulo uudelleen ohj kirjoita Dirlist.txt-tiedostoon:

dir>dirlist.txt

Jos Dirlist.txt-tiedostoa ei ole olemassa, Cmd.exe-komentotulkki luo sen. Jos tiedosto on olemassa, Cmd.exe korvaa tiedoston tiedot komennosta saaduilla tiedoilla ohj.

Suorittaaksesi komennon netsh-reititysvedos ja lähetä sitten työnsä tulokset Route.cfg:lle, kirjoita:

netsh-reititysvedos>c:\route.cfg

">"-operaattori avaa määritetyn tiedoston, jolla on vain kirjoitusoikeus. Siksi tiedostoa ei voi lukea tällä operaattorilla. Esimerkiksi suoritettaessa ohjelmaa uudelleenohjausoperaattorilla<&0 все попытки записать дескриптор 1 ни к чему не приведут, так как изначально дескриптор 0 был открыт с доступом только для чтения.

Huom.

  • Kahva 1 on oletusarvo tulosten uudelleenohjausoperaattorille ">".

käyttämällä operaattoria "<&» для перенаправления ввода и дублирования

Jotta voit käyttää syötteen uudelleenohjausoperaattoria, määritettävän tiedoston on oltava jo olemassa. Jos syöttötiedosto on olemassa, Cmd.exe-komentotulkki avaa sen vain luku -oikeuksin ja lähettää sen sisällön komennolle ikään kuin se olisi numeronäppäimistön syöte. Kun kahva on määritetty, Cmd.exe-komentotulkki kopioi sen järjestelmässä olevaksi kahvaksi.

Jos haluat esimerkiksi lukea File.txt-tiedoston syötekuvaajaksi 0 (STDIN), kirjoita:

< tiedosto.txt

Voit avata File.txt-tiedoston, lajitella sen sisällön ja lähettää sen komentokehoteikkunaan (STDOUT) kirjoittamalla:

järjestellä< tiedosto.txt

Voit etsiä File.txt-tiedoston ja ohjata kahvan 1 (STDOUT) ja kahvan 2 (STDERR) Search.txt-tiedostoon kirjoittamalla:

hakutiedosto tiedosto.txt>haku.txt 2<&1

Jos haluat kopioida käyttäjän määrittämän kuvaajan 3 syötteeksi kuvaajalle 0 (STDIN), kirjoita:

Käytä ">&"-operaattoria syötteen uudelleenohjaamiseen ja kopioimiseen

Kun ohjaat tulosteen uudelleen tiedostoon ja määrität olemassa olevan tiedostonimen, Cmd.exe-komentotulkki avaa tiedoston vain kirjoitusoikeuksin ja korvaa sen sisällön. Jos kahva on määritetty, Cmd.exe-komentotulkki kopioi tiedoston olemassa olevaan kahvaan.

Jos haluat kopioida käyttäjän määrittämän kuvaajan 3 kuvaajaksi 1, kirjoita:

Uudelleenohjataksesi kaiken lähdön, mukaan lukien deskriptorin 2 lähdön (STDERR), komennot ipconfig kahvaan 1 (STDOUT) ja ohjaa sitten tulos Output.logiin, kirjoita:

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

Käytä ">>" Operaattoria liittämään tulos

Jos haluat liittää komennon tulosteen tiedoston loppuun menettämättä siihen tallennettuja tietoja, käytä kaksinkertaista suurempaa kuin merkkiä (>>). Esimerkiksi seuraava komento lisää komennon luoman hakemistoluettelon ohj, Dirlist.txt-tiedostoon:

dir>>dirlist.txt

Lisää komentotulostus netstat kirjoita Tcpinfo.txt-tiedoston loppuun:

netstat>>tcpinfo.txt

Kanavan operaattorin käyttäminen (|)

Pystyviivaputkioperaattori (|) ottaa yhden komennon lähdön (oletus STDOUT) ja ohjaa sen toisen komennon tuloon (oletus STDIN). Esimerkiksi seuraava komento lajittelee hakemiston:

ohjaaja | järjestellä

Tässä esimerkissä molemmat komennot suoritetaan samanaikaisesti, mutta komento järjestellä pysähtyy, kunnes komennon ulostulo vastaanotetaan ohj. Joukkue järjestellä käyttää komentolähtöä ohj syötteenä ja lähettää sitten ulostulonsa kuvaajalle 1 (STDOUT).

Komentojen yhdistäminen uudelleenohjausoperaattoreihin

Yhdistämällä suodatinkomentoja muihin komentoihin ja tiedostonimiin voit luoda mukautettuja komentoja. Jos haluat esimerkiksi tallentaa tiedostonimiä, jotka sisältävät merkkijonon "LOG", käytä seuraavaa komentoa:

hakemisto /b | etsi "LOG" > loglist.txt

Komentolähtö ohj lähetetään suodatinkomentoon löytää. Merkkijonon "LOG" sisältävät tiedostonimet tallennetaan Loglist.txt-tiedostoon luettelona (esimerkiksi NetshConfig.log, Logdat.svd ja Mylog.bat).

Käytettäessä useampaa kuin yhtä suodatinta yhdessä komennossa, ne on erotettava putkella (|). Esimerkiksi seuraava komento etsii kustakin C-aseman hakemistosta tiedostoja, joiden nimessä on merkkijono "Log", ja näyttää ne sivulta:

hakemisto c:\ /s /b | etsi "LOG" | lisää

Putken (|) läsnäolo osoittaa Cmd.exe-tiedostolle, että komento tulostuu ohj täytyy lähettää suodatinkomentoon löytää. Joukkue löytää valitsee vain ne tiedostonimet, jotka sisältävät merkkijonon "LOG". Joukkue lisää näyttää komennolla saadut tiedostonimet löytää tauolla jokaisen näytön täyttymisen jälkeen.