Kuinka ohjata konsolin lähtö tiedostoon. Ohjaa tulos tiedostoon. Linuxin vakiolähtövirrat

  • Käännös

Jos olet jo hallinnut päätteen perusteet, saatat olla valmis yhdistämään oppimaasi komennot. Joskus komentotulkkikomentojen suorittaminen yksi kerrallaan riittää ratkaisemaan tietyn ongelman, mutta joissakin tapauksissa komentojen syöttäminen komennon jälkeen on liian työlästä ja järjetöntä. Tällaisessa tilanteessa jotkin erikoissymbolit, kuten kulmasulut, ovat hyödyllisiä.

Shellille, tulkki Linux-komennot, nämä ylimääräiset merkit eivät ole näytön tilan hukkaa. He ovat tehokkaita tiimejä, jotka voivat yhdistää erilaisia ​​tietoja, erottaa sen, mikä oli aiemmin kokonaista, ja tehdä paljon muuta. Yksi yksinkertaisimmista, mutta tehokkaimmista ja laajimmin käytetyistä kuoren ominaisuuksista on standarditulo-/lähtövirtojen uudelleenohjaus.

Kolme standardia I/O-virtaa

Ymmärtääksemme, mistä tässä puhutaan, on tärkeää tietää, mistä tiedot, jotka voidaan ohjata uudelleen, tulevat ja minne ne menevät. Linuxissa on kolme standardia I/O-virtaa.

Ensimmäinen on tavallinen tulovirta. Järjestelmässä tämä on säiettä nro 0 (koska tietokoneissa laskenta alkaa yleensä nollasta). Säikeen numeroita kutsutaan myös kuvailijoiksi. Tämä virta edustaa joitain päätelaitteelle välitettyjä tietoja, erityisesti komentotulkille suoritettavia ohjeita. Tyypillisesti tiedot tulevat tähän tietovirtaan, kun käyttäjä syöttää sen näppäimistöltä.

Toinen virta on vakiotulostusvirta, joka on numeroitu 1. Tämä on datavirta, jonka kuori tulostaa suoritettuaan jonkin toiminnon. Yleensä nämä tiedot päätyvät samaan pääteikkunaan, johon annettiin komento, joka aiheutti sen ilmestymisen.

Ja lopuksi, kolmas virta on tavallinen virhevirta, sillä on kahva 2. Tämä virta on samanlainen kuin tavallinen lähtövirta, koska yleensä se, mikä siihen menee, päätyy päätenäytölle. Se eroaa kuitenkin luonnostaan ​​vakiolähdöstä, ja tämän seurauksena näitä virtoja voidaan haluttaessa ohjata erikseen. Tästä on hyötyä esim seuraava tilanne. Siellä on työryhmä, joka prosessoi suuri määrä suorittamalla monimutkaisia ​​ja virheille alttiita toimenpiteitä. Haluat varmistaa, että tämän komennon luomaan hyötykuormaan ei ole sekoitettu virheilmoituksia. Tämä saavutetaan ohjaamalla erilliset ulostulo- ja virhevirrat.

Kuten luultavasti jo arvasit, I/O-uudelleenohjaus tarkoittaa työskentelyä yllä kuvattujen streamien kanssa ja tietojen ohjaamista sinne, missä ohjelmoija sitä tarvitsee. Tämä tehdään käyttämällä symboleja > ja< в erilaisia ​​yhdistelmiä, jonka käyttö riippuu siitä, minne uudelleenohjatut tiedot lopulta menevät.

Ohjaa vakiolähtö uudelleen

Oletetaan, että haluat luoda tiedoston, johon kirjoitetaan nykyinen päivämäärä ja aikaa. Asioiden helpottamiseksi on komento, jonka nimi on osuvasti päivämäärä , joka palauttaa tarvitsemamme. Tyypillisesti komentaa lähtötiedot vakiolähtöön. Jotta nämä tiedot näkyvät tiedostossa, sinun on lisättävä symboli > komennon jälkeen ennen kohdetiedoston nimeä. Ennen ja jälkeen > sinun täytyy laittaa välilyönti.

Uudelleenohjausta käytettäessä kaikki > jälkeen määritetyt tiedostot korvataan. Jos tiedostossa ei ole mitään arvokasta ja sen sisältö voi kadota, suunnittelussamme sen käyttö on jo sallittua olemassa oleva tiedosto. Yleensä on parempi käyttää tässä tapauksessa tiedostonimeä, jota ei vielä ole olemassa. Tämä tiedosto luodaan komennon suorittamisen jälkeen. Kutsutaan sitä päivämäärä.txt:ksi. Tiedostotunnisteella pisteen jälkeen ei yleensä ole suurta merkitystä, mutta laajennukset auttavat pitämään asiat järjestyksessä. Joten tässä on käskymme:

$päiväys>päiväys.txt
Tämä ei tarkoita, että tämä komento sinänsä olisi uskomattoman hyödyllinen, mutta sen perusteella voimme jo tehdä jotain mielenkiintoisempaa. Oletetaan, että haluat tietää, kuinka liikenne reititetään Internetin yli johonkin päätepisteeseen tallentamalla tiedot päivittäin. Tämän ongelman ratkaisemisessa auttaa traceroute-komento, joka raportoi tiedot liikennereitistä tietokoneemme ja komentoa kutsuttaessa määritetyn päätepisteen välillä URL-muodossa. Tiedot sisältävät tiedot kaikista reitittimistä, joiden kautta liikenne kulkee.

Koska meillä on jo tiedosto päivämäärällä, olisi aivan perusteltua liittää tähän tiedostoon traceroutelta saadut tiedot. Tätä varten sinun on käytettävä kahta > symbolia peräkkäin. Seurauksena uusi joukkue, joka ohjaa tulosteen tiedostoon, mutta ei korvaa sitä, vaan lisää uusia tietoja vanhan jälkeen, näyttäisi tältä:

$ traceroute google.com >> päivämäärä.txt
Nyt meidän tarvitsee vain muuttaa tiedoston nimi johonkin merkityksellisempään käyttämällä mv-komentoa, joka ottaa alkuperäisen tiedostonimen ensimmäisenä argumenttina ja uuden tiedostonimen toiseksi:

$ mv päivämäärä.txt jäljitys1.txt

Ohjaa vakiotulo uudelleen

Käyttämällä merkkiä< вместо >voimme ohjata vakiosyötteen uudelleen korvaamalla sen tiedoston sisällöllä.

Oletetaan, että tiedostoa on kaksi: list1.txt ja list2.txt, joista jokainen sisältää lajittelemattoman merkkijonoluettelon. Jokaisessa luettelossa on sille ainutlaatuisia elementtejä, mutta jotkin luettelon elementit ovat samoja. Löydämme sekä ensimmäisessä että toisessa listassa olevat rivit käyttämällä comm-komentoa, mutta ennen sen käyttöä listat on lajiteltava.

On lajittelukomento, joka palauttaa lajitellun luettelon päätteelle tallentamatta lajiteltua tietoa tiedostoon, josta se on otettu. Voit lähettää jokaisesta luettelosta lajitellun version osoitteeseen uusi tiedosto, käyttämällä >-komentoa ja sitten comm-komentoa. Tämä lähestymistapa vaatii kuitenkin vähintään kaksi komentoa, vaikka sama asia voidaan tehdä yhdellä rivillä luomatta tarpeettomia tiedostoja.

Joten voimme käyttää komentoa< для перенаправления отсортированной версии каждого файла команде comm . Вот что у нас получилось:

$ comm<(sort list1.txt) <(sort list2.txt)
Suluilla on tässä sama merkitys kuin matematiikassa. Shell käsittelee ensin suluissa olevat komennot ja sitten kaiken muun. Esimerkissämme tiedostojen rivit lajitellaan ensin, ja sitten tulos välitetään comm-komennolle, joka näyttää sitten luetteloiden vertailun tuloksen.

Uudelleenohjataan vakiovirhevirta

Lopuksi puhutaan normaalivirheiden uudelleenohjauksesta. Tämä voi olla tarpeen esimerkiksi virheellisten lokitiedostojen luomiseksi tai virheilmoitusten ja tietyn komennon palauttamien tietojen yhdistämiseksi yhdeksi tiedostoksi.

Entä jos esimerkiksi haluat etsiä koko järjestelmästäsi tietoja langattomista liitännöistä, jotka ovat sellaisten käyttäjien käytettävissä, joilla ei ole pääkäyttäjän oikeuksia? Voit tehdä tämän käyttämällä voimakasta etsi komento.

Tyypillisesti, kun tavallinen käyttäjä suorittaa Find-komennon kaikkialla järjestelmässä, se tulostaa sekä hyödyllistä dataa että virheitä päätelaitteelle. Samaan aikaan jälkimmäisiä on yleensä enemmän kuin edellisiä, mikä vaikeuttaa tarvitsemasi löytämistä komennon lähdöstä. Ratkaisu tähän ongelmaan on melko yksinkertainen: ohjaa vain vakiovirhevirta tiedostoon komennolla 2> (muista, että 2 on vakiovirhevirran kuvaaja). Tämän seurauksena vain se, mitä komento lähettää näytölle, tulee näkyviin. vakiolähtö:

$ find / -name langaton 2> denied.txt
Mitä tehdä, jos haluat tallentaa joukkueen työn tulokset erillinen tiedosto sekoittamatta näitä tietoja virhetietoihin? Koska virrat voidaan ohjata uudelleen toisistaan ​​riippumatta, voimme lisätä komennon, joka ohjaa vakiotulosteen rakennelmamme loppuun:

$ find / -name langaton 2> denied.txt > found.txt
Huomaa, että ensimmäinen kulmakiinnike tulee numerolla - 2> ja toinen ilman sitä. Tämä johtuu siitä, että vakiotulosteessa on kahva 1, ja komento > on tarkoitettu ohjaamaan vakiotuloste uudelleen, jos kahvan numeroa ei ole määritetty.

Lopuksi, jos haluat kaiken komennon tulosteen päätyvän yhteen tiedostoon, voit ohjata molemmat virrat samaan paikkaan &>-komennolla:

$ find / -name langaton &> tulokset.txt

Tulokset

Tässä olemme tutkineet vain tulkin virtojen uudelleenohjausmekanismin perusteita komentorivi Linux, mutta jopa se vähän, mitä olet tänään oppinut, antaa sinulle virtuaalisesti rajattomat mahdollisuudet. Ja muuten, kuten kaikki muukin terminaalissa työskentelemiseen liittyvä, streamin uudelleenohjauksen hallitseminen vaatii harjoittelua. Siksi suosittelemme, että aloitat omat kokeilusi > ja< .

Hyvät lukijat! Tiesitkö mielenkiintoisia esimerkkejä käytätkö säikeiden uudelleenohjausta Linuxissa auttamaan aloittelijoita totumaan tähän päätetekniikkaan?

Tunnet jo kaksi tapaa työskennellä komentorivikomentosarjojen tulosten kanssa:

  • Tulostietojen näyttäminen näytöllä.
  • Ohjaa tulos tiedostoon.
Joskus sinun on näytettävä jotain näytöllä ja kirjoitettava jotain tiedostoon, joten sinun on ymmärrettävä, kuinka Linux käsittelee syöttöä ja tulostusta, mikä tarkoittaa, että opit lähettämään komentosarjojen tulokset sinne, missä niitä tarvitset. Aloitetaan puhumalla tavallisista tiedostokuvauksista.

Tavalliset tiedostokuvaukset

Kaikki Linuxissa on tiedostoja, mukaan lukien syöttö ja tulos. käyttöjärjestelmä tunnistaa tiedostot kuvaajien avulla.

Jokaisella prosessilla voi olla enintään yhdeksän avointa tiedostokahvaa. bash-kuori varaa kolme ensimmäistä kahvaa, joiden tunnukset ovat 0, 1 ja 2. Tässä on mitä ne tarkoittavat.

  • 0 , STDIN - vakiotulovirta.
  • 1, STDOUT - vakiolähtövirta.
  • 2, STDERR - normaali virhevirta.
Nämä kolme erikoiskahvaa käsittelevät skriptin syöttöä ja tulostusta.
Sinun on todella ymmärrettävä vakiovirrat. Niitä voidaan verrata perusta, jolla vuorovaikutus skriptejä ulkomaailmaan. Katsotaanpa niitä koskevia yksityiskohtia.

STDIN

STDIN on komentotulkin standarditulovirta. Päätteen vakiotulo on näppäimistö. Kun skriptit käyttävät syötteen uudelleenohjausmerkkiä -< , Linux заменяет дескриптор файла vakiotulo komennossa määritettyyn. Järjestelmä lukee tiedoston ja käsittelee tiedot ikään kuin ne olisi syötetty näppäimistöltä.

monet bash-komennot hyväksy syöte STDIN:stä, jos komentorivillä ei ole määritetty tiedostoa, josta tiedot tulee ottaa. Tämä koskee esimerkiksi cat-komentoa.

Kun astut sisään kissan käsky komentorivillä, ilman parametrien määrittämistä, se hyväksyy syötteen STDIN:stä. Kun olet syöttänyt seuraavan rivin, kissa näyttää sen näytöllä.

STDOUT

STDOUT on komentotulkin vakiolähtövirta. Oletuksena tämä on näyttö. Useimmat bash-komennot tuottavat tiedot STDOUTiin, jolloin ne näkyvät konsolissa. Tiedot voidaan ohjata tiedostoon lisäämällä se sen sisältöön >>-komennolla.

Joten meillä on datatiedosto, johon voimme lisätä tietoja tällä komennolla:

Pwd >> oma tiedosto
Mitä pwd-tulosteita lisätään myfile-tiedostoon, mutta siinä jo olevat tiedot eivät katoa mihinkään.

Uudelleenohjataan komennon tulos tiedostoon

Toistaiseksi mennyt hyvin, mutta entä jos yrität tehdä jotain seuraavan kaltaista käyttämällä olematonta x-tiedostoa, joka on suunniteltu aiheuttamaan virheviestin lähettäminen omaan tiedostoon.

Ls –l xfile > oma tiedosto
Tämän komennon suorittamisen jälkeen näemme virheilmoituksia näytöllä.


Yritetään käyttää olematonta tiedostoa

Virhe syntyy yritettäessä käyttää olematonta tiedostoa, mutta komentotulkki ei ole uudelleenohjannut virheilmoituksia tiedostoon tulostamalla niitä näytölle. Halusimme kuitenkin, että virheilmoitukset sisällytetään tiedostoon. Mitä tehdä? Vastaus on yksinkertainen – käytä kolmatta vakiokuvaajaa.

STDERR

STDERR on kuoren vakiovirhevirta. Oletuksena tämä kahva osoittaa samaan asiaan kuin STDOUT, minkä vuoksi näemme näytöllä viestin, kun virhe tapahtuu.

Oletetaan, että haluamme ohjata virheilmoitukset esimerkiksi lokitiedostoon tai jonnekin muualle sen sijaan, että tulostaisimme ne näytölle.

▍Ohjaa virhevirta uudelleen

Kuten jo tiedät, tiedostokahva STDERR on 2. Voimme ohjata virheet asettamalla tämän kahvan ennen uudelleenohjauskomentoa:

Ls -l xfile 2>omatiedosto cat ./myfile
Virheviesti siirtyy nyt omaan tiedostoon.


Virheilmoituksen uudelleenohjaus tiedostoon

▍ Uudelleenohjaa virhe- ja lähtövirrat

Kun kirjoitat komentorivin komentosarjoja, saattaa olla tilanteita, joissa joudut uudelleenohjaamaan sekä virheilmoitukset että vakiotulosteet. Tämän saavuttamiseksi sinun on käytettävä uudelleenohjauskomentoja asianmukaisille kuvaajille, jotka määrittävät tiedostot, joihin virheiden ja vakiotulosteen tulee mennä:

Ls –l myfile xfile otherfile 2> errorcontent 1> rightcontent

Uudelleenohjausvirheet ja vakiotulostus

Komentotulkki ohjaa sen, mitä ls-komento normaalisti lähettää STDOUT-tiedostoon oikeaan sisältötiedostoon 1>-rakenteen ansiosta. Virheilmoitukset, jotka menevät STDERR:iin, päätyvät errorcontent-tiedostoon 2>-uudelleenohjauskomennon vuoksi.

Tarvittaessa sekä STDERR että STDOUT voidaan uudelleenohjata samaan tiedostoon &>-komennolla:


Uudelleenohjataan STDERR ja STDOUT samaan tiedostoon

Kun komento on suoritettu, STDERR:lle ja STDOUT:lle tarkoitettu päätyy sisältötiedostoon.

Tulosteen uudelleenohjaus skripteissä

On kaksi tapaa ohjata tulostetta komentorivikomentosarjassa:
  • Väliaikainen uudelleenohjaus tai yksirivinen lähdön uudelleenohjaus.
  • Pysyvä uudelleenohjaus tai koko komentosarjan tulosteen tai sen osan uudelleenohjaus.

▍ Väliaikainen lähdön uudelleenohjaus

Skriptissä voit ohjata yhden rivin tulosteen STDERR:iin. Voit tehdä tämän käyttämällä uudelleenohjauskomentoa, joka määrittää STDERR-kuvaajan ja ennen kuvaajan numeroa et-merkillä (&):

#!/bin/bash echo "Tämä on virhe" >&2 echo "Tämä on normaali lähtö"
Jos suoritat skriptin, molemmat rivit ilmestyvät näytölle, koska kuten jo tiedät, oletusarvoisesti virheet tulostuvat samaan paikkaan kuin normaalit tiedot.


Väliaikainen uudelleenohjaus

Suoritetaan komentosarja niin, että STDERR-tuloste menee tiedostoon.

./myscript 2> myfile
Kuten näet, nyt normaali lähtö lähetetään konsoliin ja virheilmoitukset menevät tiedostoon.


Virheilmoitukset kirjoitetaan tiedostoon

▍Pysyvä lähdön uudelleenohjaus

Jos komentosarjasi täytyy ohjata paljon ulostuloa näytölle, on hankalaa lisätä sopiva komento jokaiseen kaikukutsuun. Sen sijaan voit määrittää tulosteen uudelleenohjautuvan tiettyyn kahvaan komentosarjan ajaksi käyttämällä exec-komentoa:

#!/bin/bash exec 1>outfile echo "Tämä on testi kaiken lähdön uudelleenohjaamisesta" echo "suojakomentosarjasta toiseen tiedostoon." echo "ilman, että jokaista riviä tarvitsee uudelleenohjata"
Suoritetaan käsikirjoitus.


Kaikkien tulosteiden uudelleenohjaus tiedostoon

Jos katsot tulosteen uudelleenohjauskomennossa määritettyä tiedostoa, huomaat, että kaikki kaikukomentojen tuottama päätyi kyseiseen tiedostoon.

Exec-komentoa voidaan käyttää paitsi skriptin alussa, myös muissa paikoissa:

#!/bin/bash exec 2>myerror echo "Tämä on aloitus komentosarjasta" echo "nyt ohjataan kaikki tulosteet toiseen paikkaan" exec 1>myfile echo "Tämän pitäisi mennä myfile-tiedostoon" echo "ja tämän pitäisi mennä myerror-tiedostoon" >&2
Tämän saat suoritettuasi komentosarjan ja tarkasteltuasi tiedostoja, joihin ohjasimme tulosteen.


Tulosteen uudelleenohjaus eri tiedostoihin

Exec-komento ohjaa ensin STDERR:n lähdön tiedostomyerror-tiedostoon. Useiden kaikukomentojen tulos lähetetään sitten STDOUTiin ja tulostetaan näytölle. Exec-komento saa sitten sen, mikä päätyy STDOUT-tiedostoon, lähetetään tiedostoon myfile, ja lopuksi käytämme echo-komennossa uudelleenohjauskomentoa STDERR:iin, mikä aiheuttaa vastaavan rivin kirjoittamisen tiedostomyerror-tiedostoon.

Kun olet oppinut tämän, voit ohjata tulosteen haluamaasi paikkaan. Puhutaan nyt syötteen uudelleenohjauksesta.

Uudelleenohjaus skripteissä

Voit ohjata syötteen uudelleen käyttämällä samaa tekniikkaa, jota käytimme tulosteen uudelleenohjauksessa. Esimerkiksi exec-komennolla voit tehdä tiedostosta STDIN-tietolähteen:

Suoritus 0< myfile
Tämä komento kertoo komentotulkille, että tulolähteen tulee olla myfile eikä normaali STDIN. Katsotaanpa syötteen uudelleenohjausta toiminnassa:

#!/bin/bash exec 0< testfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done
Tämä näkyy näytöllä skriptin suorittamisen jälkeen.


Tulon uudelleenohjaus

Aiemmassa artikkelissa opit käyttämään lukukomentoa käyttäjän syötteiden lukemiseen näppäimistöltä. Jos ohjaat syötteen uudelleen tekemällä tietolähteestä tiedoston, lukukomento, kun yrität lukea tietoja STDINistä, lukee sen tiedostosta, ei näppäimistöltä.

Jotkut Linux-järjestelmänvalvojat käyttävät tätä lähestymistapaa lokitiedostojen lukemiseen ja käsittelyyn.

Oman tulosteen uudelleenohjauksen luominen

Uudelleenohjaamalla syötteen ja tulosteen komentosarjoissa et rajoita kolmeen vakiotiedostokuvaajaan. Kuten jo mainittiin, sinulla voi olla jopa yhdeksän avointa kahvaa. Loput kuusi, numeroitu 3–8, voidaan käyttää tulon tai lähdön uudelleenohjaamiseen. Mikä tahansa niistä voidaan liittää tiedostoon ja käyttää komentosarjakoodissa.

Voit määrittää kahvan lähtötiedoille käyttämällä exec-komentoa:

#!/bin/bash exec 3>myfile echo "Tämän pitäisi näkyä näytöllä" echo "ja tämä pitäisi tallentaa tiedostoon" >&3 echo "Ja tämän pitäisi olla takaisin näytöllä"
Skriptin suorittamisen jälkeen osa tulosteesta näkyy näytöllä, osa - tiedostossa, jonka kuvaaja on 3.


Tulosteen uudelleenohjaus omalla kahvallaan

Tiedostokuvainten luominen tiedonsyöttöä varten

Voit ohjata skriptin syötteen uudelleen samalla tavalla kuin ohjaat tulosteen uudelleen. Tallenna STDIN toiseen kahvaan ennen syötteen uudelleenohjausta.

Kun olet lukenut tiedoston, voit palauttaa STDIN-koodin ja käyttää sitä tavalliseen tapaan:

#!/bin/bash exec 6<&0 exec 0< myfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done exec 0<&6 read -p "Are you done now? " answer case $answer in y) echo "Goodbye";; n) echo "Sorry, this is the end.";; esac
Kokeillaan skenaariota.


Tulon uudelleenohjaus

Tässä esimerkissä tiedostokuvaajaa 6 käytettiin tallentamaan viittaus STDIN-numeroon. Sitten syötteen uudelleenohjaus tehtiin, tiedostosta tuli STDIN-tietolähde. Syöte lukukomentoon tuli sitten uudelleenohjatusta STDIN-numerosta, eli tiedostosta.

Kun olet lukenut tiedoston, nollaamme STDIN-koodin ohjaamalla sen käsittelemään 6. Nyt tarkistaakseen, että kaikki toimii oikein, komentosarja kysyy käyttäjältä kysymyksen, odottaa näppäimistön syöttöä ja käsittelee syötetyn.

Suljetaan tiedostokahvat

Shell sulkee tiedostokahvat automaattisesti, kun komentosarja on valmis. Joissakin tapauksissa on kuitenkin tarpeen sulkea kahvat manuaalisesti ennen kuin komentosarja on suoritettu loppuun. Kahvan sulkemiseksi se on ohjattava osoitteeseen &- . Se näyttää tältä:

#!/bin/bash exec 3> myfile echo "Tämä on testirivi" >&3 exec 3>&- echo "Tämä ei toimi" >&3
Skriptin suorittamisen jälkeen saamme virheilmoituksen.


Yritetään käyttää suljettua tiedostokuvaajaa

Asia on siinä, että yritimme käyttää olematonta kuvaajaa.

Ole varovainen, kun suljet skriptien tiedostokahvoja. Jos lähetit tietoja tiedostoon, suljit kahvan ja avasit sen sitten uudelleen, komentotulkki korvaa olemassa olevan tiedoston uudella. Eli kaikki tähän tiedostoon aiemmin kirjoitettu menetetään.

Tietojen saaminen avoimista kahvoista

Saat luettelon kaikista Linuxissa avoimista kahvoista käyttämällä lsof-komentoa. Monissa jakeluissa, kuten Fedorassa, lsof-apuohjelma sijaitsee /usr/sbin. Tämä komento on varsin hyödyllinen, koska se näyttää tiedot jokaisesta järjestelmässä avoinna olevasta kahvasta. Tämä sisältää mitä taustalla käynnissä olevat prosessit avaavat ja mitä sisäänkirjautuneet käyttäjät avaavat.

Tässä komennossa on monia näppäimiä, katsotaanpa tärkeimpiä.

  • -p Mahdollistaa prosessin tunnuksen määrittämisen.
  • -d Voit määrittää sen kuvaajan numeron, josta haluat saada tietoja.
Nykyisen prosessin PID:n selvittämiseksi voit käyttää erityistä ympäristömuuttuja$$, johon kuori kirjoittaa nykyisen PID:n.

-a-kytkintä käytetään suorittamaan looginen JA-operaatio tuloksille, jotka palautetaan käyttämällä kahta muuta kytkintä:

Lsof -a -p $$ -d 0,1,2

Näyttää tietoja avoimista kahvoista

STDIN-, STDOUT- ja STDERR-tiedostojen tyyppi on CHR (merkkitila). Koska ne kaikki osoittavat päätelaitteeseen, tiedoston nimi vastaa päätelaitteelle määritetyn laitteen nimeä. Kaikki kolme vakiotiedostoa ovat sekä luettavia että kirjoitettavia.

Tarkastellaanpa lsof-komennon kutsumista skriptistä, jossa on normaalien lisäksi auki muita kuvauksia:

#!/bin/bash exec 3> myfile1 exec 6> myfile2 exec 7< myfile3 lsof -a -p $$ -d 0,1,2,3,6,7
Näin tapahtuu, jos suoritat tämän skriptin.


Näytä komentosarjan avaamat tiedostokahvat

Skripti avasi kaksi kahvaa ulostulolle (3 ja 6) ja yhden tulolle (7). Myös kuvaimien määrittämiseen käytettyjen tiedostojen polut näytetään.

Ulostulon vaimennus

Joskus on varmistettava, että komentosarjan komennot, jotka esimerkiksi voidaan suorittaa kuten taustaprosessi, näytöllä ei näkynyt mitään. Voit tehdä tämän ohjaamalla tulosteen hakemistoon /dev/null. Tämä on vähän kuin "musta aukko".

Tässä on esimerkki virheilmoitusten estämisestä:

Ls -al badfile otherfile 2> /dev/null
Samaa lähestymistapaa käytetään esimerkiksi, jos haluat tyhjentää tiedoston poistamatta sitä:

Cat /dev/null > oma tiedosto

Tulokset

Tänään opit kuinka syöttö ja tulos toimivat komentorivikomentosarjassa. Nyt tiedät kuinka käsitellä tiedostokuvaajia, luoda, tarkastella ja sulkea niitä sekä tietää syöttö-, tulos- ja virhevirtojen uudelleenohjauksesta. Kaikki tämä on erittäin tärkeää bash-skriptien kehittämisessä.

Ensi kerralla puhutaan Linux-signaalit, kuinka niitä käsitellään skripteinä, ajoitettujen töiden suorittamisesta ja taustatehtävistä.

Hyvät lukijat! Tämä materiaali tarjoaa perusteet työskennellä tulo-, tulos- ja virhevirtojen kanssa. Olemme varmoja, että joukossasi on ammattilaisia, jotka voivat kertoa tästä kaikesta, mitä vain kokemuksella tulee. Jos näin on, annamme puheenvuoron sinulle.

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; ja jos määritetty tiedosto ei ollut olemassa, silloin 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. Skriptissä, joka automatisoi joitain rutiinitoiminnot, 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 se ei tee siitä vähemmän tärkeää tämä mekanismi, koska vakiovuot määritellään 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. Vakiotulo stdin on numero 0, vakiolähtö stdout on numero 1, vakiovirhevirta stderr on numero 2. Eli täysi muoto Uudelleenohjauskomento näyttää tältä (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 > .

Paitsi yksinkertainen uudelleenohjaus tavallisia virtoja, on myös mahdollista paitsi ohjata streamia jollekin kanavalle, vaan 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 monistuisivat 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 tulosteen uudelleenohjaukselle on järjestää ohjelmakanava(kutsutaan joskus putkiksi 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". Komentotulostus 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

Etsitään syöttötiedosto tai tietoja standardista syöttölinja, jotka sisältävät määritetyn kuvion, ja tulosta ne vakiolähtöön

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 vakiotulostukseen: yksi - rivit, jotka esiintyvät vain yhdessä tiedostossa, toinen - rivit, jotka esiintyvät vain toisessa tiedostossa: ja kolmas - rivit, jotka näkyvät molemmissa tiedostoissa

Tulostusmuodot tekstitiedosto tai vakiosyötteen sisältö

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, jonka 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

Tunnet jo kaksi tapaa työskennellä komentorivikomentosarjojen tulosten kanssa:

  • Tulostietojen näyttäminen näytöllä.
  • Ohjaa tulos tiedostoon.
Joskus sinun on näytettävä jotain näytöllä ja kirjoitettava jotain tiedostoon, joten sinun on ymmärrettävä, kuinka Linux käsittelee syöttöä ja tulostusta, mikä tarkoittaa, että opit lähettämään komentosarjojen tulokset sinne, missä niitä tarvitset. Aloitetaan puhumalla tavallisista tiedostokuvauksista.

Tavalliset tiedostokuvaukset

Kaikki Linuxissa on tiedostoja, mukaan lukien syöttö ja tulos. Käyttöjärjestelmä tunnistaa tiedostot tiedostokuvaajien avulla.

Jokaisella prosessilla voi olla enintään yhdeksän avointa tiedostokahvaa. Bash-kuori varaa kolme ensimmäistä kahvaa, joiden tunnukset ovat 0, 1 ja 2. Tässä on mitä ne tarkoittavat.

  • 0 , STDIN - vakiotulovirta.
  • 1, STDOUT - vakiolähtövirta.
  • 2, STDERR - normaali virhevirta.
Nämä kolme erikoiskahvaa käsittelevät skriptin syöttöä ja tulostusta.
Sinun on todella ymmärrettävä vakiovirrat. Niitä voidaan verrata perustaan, jolle käsikirjoituksen vuorovaikutus ulkomaailman kanssa rakentuu. Katsotaanpa niitä koskevia yksityiskohtia.

STDIN

STDIN on komentotulkin standarditulovirta. Päätteen vakiotulo on näppäimistö. Kun skriptit käyttävät syötteen uudelleenohjausmerkkiä -< , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

Monet bash-komennot hyväksyvät syötteen STDIN-koodista, ellei komentorivi määritä tiedostoa, josta tiedot otetaan. Tämä koskee esimerkiksi cat-komentoa.

Kun annat cat-komennon komentoriville määrittämättä mitään parametreja, se hyväksyy syötteen STDIN-koodista. Kun olet syöttänyt seuraavan rivin, kissa näyttää sen näytöllä.

STDOUT

STDOUT on komentotulkin vakiolähtövirta. Oletuksena tämä on näyttö. Useimmat bash-komennot tuottavat tiedot STDOUTiin, jolloin ne näkyvät konsolissa. Tiedot voidaan ohjata tiedostoon lisäämällä se sen sisältöön >>-komennolla.

Joten meillä on datatiedosto, johon voimme lisätä tietoja tällä komennolla:

Pwd >> oma tiedosto
Mitä pwd-tulosteita lisätään myfile-tiedostoon, mutta siinä jo olevat tiedot eivät katoa mihinkään.

Uudelleenohjataan komennon tulos tiedostoon

Toistaiseksi mennyt hyvin, mutta entä jos yrität tehdä jotain seuraavan kaltaista käyttämällä olematonta x-tiedostoa, joka on suunniteltu aiheuttamaan virheviestin lähettäminen omaan tiedostoon.

Ls –l xfile > oma tiedosto
Tämän komennon suorittamisen jälkeen näemme virheilmoituksia näytöllä.


Yritetään käyttää olematonta tiedostoa

Virhe syntyy yritettäessä käyttää olematonta tiedostoa, mutta komentotulkki ei ole uudelleenohjannut virheilmoituksia tiedostoon tulostamalla niitä näytölle. Halusimme kuitenkin, että virheilmoitukset sisällytetään tiedostoon. Mitä tehdä? Vastaus on yksinkertainen – käytä kolmatta vakiokuvaajaa.

STDERR

STDERR on kuoren vakiovirhevirta. Oletuksena tämä kahva osoittaa samaan asiaan kuin STDOUT, minkä vuoksi näemme näytöllä viestin, kun virhe tapahtuu.

Oletetaan, että haluamme ohjata virheilmoitukset esimerkiksi lokitiedostoon tai jonnekin muualle sen sijaan, että tulostaisimme ne näytölle.

▍Ohjaa virhevirta uudelleen

Kuten jo tiedät, tiedostokahva STDERR on 2. Voimme ohjata virheet asettamalla tämän kahvan ennen uudelleenohjauskomentoa:

Ls -l xfile 2>omatiedosto cat ./myfile
Virheviesti siirtyy nyt omaan tiedostoon.


Virheilmoituksen uudelleenohjaus tiedostoon

▍ Uudelleenohjaa virhe- ja lähtövirrat

Kun kirjoitat komentorivin komentosarjoja, saattaa olla tilanteita, joissa joudut uudelleenohjaamaan sekä virheilmoitukset että vakiotulosteet. Tämän saavuttamiseksi sinun on käytettävä uudelleenohjauskomentoja asianmukaisille kuvaajille, jotka määrittävät tiedostot, joihin virheiden ja vakiotulosteen tulee mennä:

Ls –l myfile xfile otherfile 2> errorcontent 1> rightcontent

Uudelleenohjausvirheet ja vakiotulostus

Komentotulkki ohjaa sen, mitä ls-komento normaalisti lähettää STDOUT-tiedostoon oikeaan sisältötiedostoon 1>-rakenteen ansiosta. Virheilmoitukset, jotka menevät STDERR:iin, päätyvät errorcontent-tiedostoon 2>-uudelleenohjauskomennon vuoksi.

Tarvittaessa sekä STDERR että STDOUT voidaan uudelleenohjata samaan tiedostoon &>-komennolla:


Uudelleenohjataan STDERR ja STDOUT samaan tiedostoon

Kun komento on suoritettu, STDERR:lle ja STDOUT:lle tarkoitettu päätyy sisältötiedostoon.

Tulosteen uudelleenohjaus skripteissä

On kaksi tapaa ohjata tulostetta komentorivikomentosarjassa:
  • Väliaikainen uudelleenohjaus tai yksirivinen lähdön uudelleenohjaus.
  • Pysyvä uudelleenohjaus tai koko komentosarjan tulosteen tai sen osan uudelleenohjaus.

▍ Väliaikainen lähdön uudelleenohjaus

Skriptissä voit ohjata yhden rivin tulosteen STDERR:iin. Voit tehdä tämän käyttämällä uudelleenohjauskomentoa, joka määrittää STDERR-kuvaajan ja ennen kuvaajan numeroa et-merkillä (&):

#!/bin/bash echo "Tämä on virhe" >&2 echo "Tämä on normaali lähtö"
Jos suoritat skriptin, molemmat rivit ilmestyvät näytölle, koska kuten jo tiedät, oletusarvoisesti virheet tulostuvat samaan paikkaan kuin normaalit tiedot.


Väliaikainen uudelleenohjaus

Suoritetaan komentosarja niin, että STDERR-tuloste menee tiedostoon.

./myscript 2> myfile
Kuten näet, nyt normaali lähtö lähetetään konsoliin ja virheilmoitukset menevät tiedostoon.


Virheilmoitukset kirjoitetaan tiedostoon

▍Pysyvä lähdön uudelleenohjaus

Jos komentosarjasi täytyy ohjata paljon ulostuloa näytölle, on hankalaa lisätä sopiva komento jokaiseen kaikukutsuun. Sen sijaan voit määrittää tulosteen uudelleenohjautuvan tiettyyn kahvaan komentosarjan ajaksi käyttämällä exec-komentoa:

#!/bin/bash exec 1>outfile echo "Tämä on testi kaiken lähdön uudelleenohjaamisesta" echo "suojakomentosarjasta toiseen tiedostoon." echo "ilman, että jokaista riviä tarvitsee uudelleenohjata"
Suoritetaan käsikirjoitus.


Kaikkien tulosteiden uudelleenohjaus tiedostoon

Jos katsot tulosteen uudelleenohjauskomennossa määritettyä tiedostoa, huomaat, että kaikki kaikukomentojen tuottama päätyi kyseiseen tiedostoon.

Exec-komentoa voidaan käyttää paitsi skriptin alussa, myös muissa paikoissa:

2 myerror-tiedostoon" >&2
Tämän saat suoritettuasi komentosarjan ja tarkasteltuasi tiedostoja, joihin ohjasimme tulosteen.


Tulosteen uudelleenohjaus eri tiedostoihin

Exec-komento ohjaa ensin STDERR:n lähdön tiedostomyerror-tiedostoon. Useiden kaikukomentojen tulos lähetetään sitten STDOUTiin ja tulostetaan näytölle. Exec-komento saa sitten sen, mikä päätyy STDOUT-tiedostoon, lähetetään tiedostoon myfile, ja lopuksi käytämme echo-komennossa uudelleenohjauskomentoa STDERR:iin, mikä aiheuttaa vastaavan rivin kirjoittamisen tiedostomyerror-tiedostoon.

Kun olet oppinut tämän, voit ohjata tulosteen haluamaasi paikkaan. Puhutaan nyt syötteen uudelleenohjauksesta.

Uudelleenohjaus skripteissä

Voit ohjata syötteen uudelleen käyttämällä samaa tekniikkaa, jota käytimme tulosteen uudelleenohjauksessa. Esimerkiksi exec-komennolla voit tehdä tiedostosta STDIN-tietolähteen:

Suoritus 0< myfile
Tämä komento kertoo komentotulkille, että tulolähteen tulee olla myfile eikä normaali STDIN. Katsotaanpa syötteen uudelleenohjausta toiminnassa:

#!/bin/bash exec 0< testfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done
Tämä näkyy näytöllä skriptin suorittamisen jälkeen.


Tulon uudelleenohjaus

Aiemmassa artikkelissa opit käyttämään lukukomentoa käyttäjän syötteiden lukemiseen näppäimistöltä. Jos ohjaat syötteen uudelleen tekemällä tietolähteestä tiedoston, lukukomento, kun yrität lukea tietoja STDINistä, lukee sen tiedostosta, ei näppäimistöltä.

Jotkut Linux-järjestelmänvalvojat käyttävät tätä lähestymistapaa lokitiedostojen lukemiseen ja käsittelyyn.

Oman tulosteen uudelleenohjauksen luominen

Uudelleenohjaamalla syötteen ja tulosteen komentosarjoissa et rajoita kolmeen vakiotiedostokuvaajaan. Kuten jo mainittiin, sinulla voi olla jopa yhdeksän avointa kahvaa. Loput kuusi, numeroitu 3–8, voidaan käyttää tulon tai lähdön uudelleenohjaamiseen. Mikä tahansa niistä voidaan liittää tiedostoon ja käyttää komentosarjakoodissa.

Voit määrittää kahvan lähtötiedoille käyttämällä exec-komentoa:

#!/bin/bash exec 3>myfile echo "Tämän pitäisi näkyä näytöllä" echo "ja tämä pitäisi tallentaa tiedostoon" >&3 echo "Ja tämän pitäisi olla takaisin näytöllä"
Skriptin suorittamisen jälkeen osa tulosteesta näkyy näytöllä, osa - tiedostossa, jonka kuvaaja on 3.


Tulosteen uudelleenohjaus omalla kahvallaan

Tiedostokuvainten luominen tiedonsyöttöä varten

Voit ohjata skriptin syötteen uudelleen samalla tavalla kuin ohjaat tulosteen uudelleen. Tallenna STDIN toiseen kahvaan ennen syötteen uudelleenohjausta.

Kun olet lukenut tiedoston, voit palauttaa STDIN-koodin ja käyttää sitä tavalliseen tapaan:

#!/bin/bash exec 6<&0 exec 0< myfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done exec 0<&6 read -p "Are you done now? " answer case $answer in y) echo "Goodbye";; n) echo "Sorry, this is the end.";; esac
Kokeillaan skenaariota.


Tulon uudelleenohjaus

Tässä esimerkissä tiedostokuvaajaa 6 käytettiin tallentamaan viittaus STDIN-numeroon. Sitten syötteen uudelleenohjaus tehtiin, tiedostosta tuli STDIN-tietolähde. Syöte lukukomentoon tuli sitten uudelleenohjatusta STDIN-numerosta, eli tiedostosta.

Kun olet lukenut tiedoston, nollaamme STDIN-koodin ohjaamalla sen käsittelemään 6. Nyt tarkistaakseen, että kaikki toimii oikein, komentosarja kysyy käyttäjältä kysymyksen, odottaa näppäimistön syöttöä ja käsittelee syötetyn.

Suljetaan tiedostokahvat

Shell sulkee tiedostokahvat automaattisesti, kun komentosarja on valmis. Joissakin tapauksissa on kuitenkin tarpeen sulkea kahvat manuaalisesti ennen kuin komentosarja on suoritettu loppuun. Kahvan sulkemiseksi se on ohjattava osoitteeseen &- . Se näyttää tältä:

#!/bin/bash exec 3> myfile echo "Tämä on testirivi" >&3 exec 3>&- echo "Tämä ei toimi" >&3
Skriptin suorittamisen jälkeen saamme virheilmoituksen.


Yritetään käyttää suljettua tiedostokuvaajaa

Asia on siinä, että yritimme käyttää olematonta kuvaajaa.

Ole varovainen, kun suljet skriptien tiedostokahvoja. Jos lähetit tietoja tiedostoon, suljit kahvan ja avasit sen sitten uudelleen, komentotulkki korvaa olemassa olevan tiedoston uudella. Eli kaikki tähän tiedostoon aiemmin kirjoitettu menetetään.

Tietojen saaminen avoimista kahvoista

Saat luettelon kaikista Linuxissa avoimista kahvoista käyttämällä lsof-komentoa. Monissa jakeluissa, kuten Fedorassa, lsof-apuohjelma sijaitsee /usr/sbin. Tämä komento on varsin hyödyllinen, koska se näyttää tiedot jokaisesta järjestelmässä avoinna olevasta kahvasta. Tämä sisältää mitä taustalla käynnissä olevat prosessit avaavat ja mitä sisäänkirjautuneet käyttäjät avaavat.

Tässä komennossa on monia näppäimiä, katsotaanpa tärkeimpiä.

  • -p Mahdollistaa prosessin tunnuksen määrittämisen.
  • -d Voit määrittää sen kuvaajan numeron, josta haluat saada tietoja.
Nykyisen prosessin PID:n selvittämiseksi voidaan käyttää erityistä ympäristömuuttujaa $$, johon kuori kirjoittaa nykyisen PID:n.

-a-kytkintä käytetään suorittamaan looginen JA-operaatio tuloksille, jotka palautetaan käyttämällä kahta muuta kytkintä:

Lsof -a -p $$ -d 0,1,2

Näyttää tietoja avoimista kahvoista

STDIN-, STDOUT- ja STDERR-tiedostojen tyyppi on CHR (merkkitila). Koska ne kaikki osoittavat päätelaitteeseen, tiedoston nimi vastaa päätelaitteelle määritetyn laitteen nimeä. Kaikki kolme vakiotiedostoa ovat sekä luettavia että kirjoitettavia.

Tarkastellaanpa lsof-komennon kutsumista skriptistä, jossa on normaalien lisäksi auki muita kuvauksia:

#!/bin/bash exec 3> myfile1 exec 6> myfile2 exec 7< myfile3 lsof -a -p $$ -d 0,1,2,3,6,7
Näin tapahtuu, jos suoritat tämän skriptin.


Näytä komentosarjan avaamat tiedostokahvat

Skripti avasi kaksi kahvaa ulostulolle (3 ja 6) ja yhden tulolle (7). Myös kuvaimien määrittämiseen käytettyjen tiedostojen polut näytetään.

Ulostulon vaimennus

Joskus on varmistettava, että komentosarjan komennot, jotka voidaan suorittaa esimerkiksi taustaprosessina, eivät näytä mitään näytöllä. Voit tehdä tämän ohjaamalla tulosteen hakemistoon /dev/null. Tämä on vähän kuin "musta aukko".

Tässä on esimerkki virheilmoitusten estämisestä:

Ls -al badfile otherfile 2> /dev/null
Samaa lähestymistapaa käytetään esimerkiksi, jos haluat tyhjentää tiedoston poistamatta sitä:

Cat /dev/null > oma tiedosto

Tulokset

Tänään opit kuinka syöttö ja tulos toimivat komentorivikomentosarjassa. Nyt tiedät kuinka käsitellä tiedostokuvaajia, luoda, tarkastella ja sulkea niitä sekä tietää syöttö-, tulos- ja virhevirtojen uudelleenohjauksesta. Kaikki tämä on erittäin tärkeää bash-skriptien kehittämisessä.

Seuraavan kerran puhumme Linux-signaaleista, niiden käsittelemisestä komentosarjoissa, ajoitettujen töiden suorittamisesta ja taustatehtävistä.

Hyvät lukijat! Tämä materiaali tarjoaa perusteet työskennellä tulo-, tulos- ja virhevirtojen kanssa. Olemme varmoja, että joukossasi on ammattilaisia, jotka voivat kertoa tästä kaikesta, mitä vain kokemuksella tulee. Jos näin on, annamme puheenvuoron sinulle.

Uudelleenohjaus suoritetaan yleensä lisäämällä erikoismerkki ">" komentojen väliin. Tyypillisesti syntaksi näyttää tältä:

Komento1 > tiedosto1

suorittaa komennon1 ja kirjoittaa vakiotulosteen tiedostoon1.

Joukkue 1< файл1

suorittaa komennon1 käyttämällä tiedosto1:tä syöttölähteenä (näppäimistön sijaan).

Joukkue 1< файл1 >tiedosto2

yhdistää kaksi aiemmat versiot. Suorittaa komennon1 syötteellä tiedosto1:stä ja tulosteen tiedostosta2

Kuljettimet

Liukulinjat ovat useiden ohjelmien kykyä toimia yhdessä, kun yhden ohjelman tulos menee suoraan toisen ohjelman tuloon ilman välimuotoa. väliaikaiset tiedostot. Syntaksi:

joukkue1 | joukkue 2

Suorittaa komennon1 käyttämällä sen lähtövirtaa tulovirtana suoritettaessa komentoa2, mikä vastaa kahden uudelleenohjauksen ja väliaikaisen tiedoston käyttöä:

Komento1 > Väliaikainen tiedosto komento2< ВременныйФайл rm ВременныйФайл

Hyvä esimerkki komentoputkista on kaiun yhdistäminen toiseen komentoon vuorovaikutteisuuden saavuttamiseksi ei-interaktiivisissa ympäristöissä, esimerkiksi:

echo -e "Käyttäjätunnus\nSalasana" | ftp localhost

Tämä käynnistää asiakkaan, joka muodostaa yhteyden localhostiin käyttäjänimenä, painaa Enter ja syöttää sitten salasanan Salasana.

Uudelleenohjaus tavallisiin tiedostokuvauksiin/tiedostoista

Joukkueessa UNIX-kuori, joka on peräisin Bourne-kuoresta, kahta edellistä vaihetta voidaan parantaa määrittämällä numero (tiedostokuvaaja) välittömästi ennen uudelleenohjausmerkkiä. Tämä numero ilmaisee, mitä virtaa käytetään uudelleenohjaukseen. UNIXissa on seuraavat vakiotulo-/lähtövirrat:

Esimerkiksi:

Komento1 2 > tiedosto1

C-kuoresta johdetuissa komentotulkeissa on syntaksin sääntöjen mukaisesti lisättävä &-merkki uudelleenohjausmerkin perään, jotta voidaan ilmaista virta, johon uudelleenohjaus suoritetaan.

Usein standardivirhevirta yhdistetään standardilähtövirtaan, jotta virheet ja normaali ohjelmatulos voidaan käsitellä yhdessä. Esimerkiksi:

Etsi / -nimi .profiili> tulokset.txt 2>&1

yrittää löytää kaikki tiedostot, joiden nimi on .profile. Jos suoritat tämän komennon ilman uudelleenohjauksia, se ohjaa hakutulokset osoitteeseen ja virheilmoitukset (esimerkiksi riittämättömistä käyttöoikeuksista, kun yrität etsiä suojatuista hakemistoista) osoitteeseen . Oletusarvoisesti nämä roolit suorittaa konsoli. Jos vakiotulostus ohjataan tulostiedostoon, virheet lähetetään silti konsoliin. Sen varmistamiseksi, että sekä virheet että hakutulokset lähetetään results.txt-tiedostoon, vakiovirhe- ja tulostusvirrat yhdistetään käyttämällä 2>&1 .

Kirjoittaminen 2>&1 ennen > ei toimi, koska kun tulkki lukee 2>&1 , se ei vielä tiedä, minne vakiolähtövirta ohjataan, joten virhe- ja lähtövirtaa ei yhdistetä.

Jos yhdistetty tulos on pipetoitava toisen ohjelman tuloon, niin sekvenssi 2>&1 on oltava kuljetinkyltin edessä. Esimerkiksi:

Etsi / -name .profile 2>&1 | Vähemmän

Yksinkertaistettu komentolomake:

Komento>tiedosto2>&1

näyttää tältä:

Komento &> tiedosto

Komento>&tiedosto

Kuljetinketju

Uudelleenohjaus- ja putkikomennot voidaan ketjuttaa yhteen monimutkaisempien komentojen tuottamiseksi, esimerkiksi:

ls | grep ".sh" | sort>shlist

Hakee luettelon nykyisen hakemiston sisällöstä, joka suodatetaan jättäen vain rivit, jotka sisältävät ".sh", sitten tämä suodatettu luettelo lajitellaan leksikaalisesti ja lopputulos laitetaan tiedostoon shlist. Tämän tyyppisiä rakenteita löytyy usein UNIX-komentosarjoista.

Uudelleenohjaus useisiin pinsseihin

Vakiokomento voi ohjata komennon ulostulon useisiin paikkoihin kerralla. Esimerkki:

Ls -lrt | tee-tiedosto1

ohjaa komennon vakiotulostusta ls -lrt(tiedostoluettelo) sekä konsolissa että sisään tiedosto1.

Uudelleenohjaus liitteenä

IN komentokuori voit ohjata loppuun liitettyä tiedostoa. Tässä tapauksessa tiedostoon tallennettuja tietoja ei poisteta, vaan kaikki uutta tietoa lisätään tämän tiedoston loppuun. Syntaksi:

Komento1>> tiedosto1

Upotettu asiakirja

Jotkut kuoret ja jopa sovelletut kielet (PHP), Perl, sallivat sisäänrakennettujen asiakirjojen syntaksin (katso Heredoc-syntaksi), jonka avulla voit ohjata syöttövirran itse ohjelmatiedostosta, esimerkiksi: cat « EOF Any teksti on sijoitettu tähän, mukaan lukien erikoismerkkejä EOF

Upotetun dokumentin EOF lopun lopullinen allekirjoitus (saatetaan käyttää mielivaltaista arvoa, mutta EOF on usein käytössä - merkityksen mukaan) on aloitettava rivin alusta.