4. Ümbersuunamine ja torud

4.1. Veel veidi protsessidest

Ümbersuunamise ja torude mõistmiseks peame rääkima taas veidi protsessidest. Enamik UNIX® protsesse (nende hulka kuuluvad ka graafilised rakendused, aga ei kuulu enamik deemoneid) kasutavad vähemalt kolme faili deskriptorit: standardsisend, standardväljund ja standardveaväljund. Neid tähistavad vastavalt numbrid 0, 1 ja 2. Üldiselt on need deskriptorid seotud terminaliga, kus protsess käivitati, ning sisendiks on klaviatuur. Ümbersuunamise ja torude eesmärk ongi deskriptorid ümber suunata. Paremini aitavad seda kontseptsiooni mõista käesolevas osas toodud näited.

4.2. Ümbersuunamine

Oletame näiteks, et tahate näha nimekirja kõigi failidega, mille lõpus seisab .png[15], ja mis asuvad kataloogis pildid. Nimekiri tuleks väga pikk, mistõttu oleks mõttekas see salvestada faili, et siis sellega sobival ajal rahulikult tutvuda. Selleks võib anda järgmise käsu:

$ ls pildid/*.png 1>faili_nimekiri

See tähendab, et antud käsu standardväljund (1) suunatakse ümber (>) faili nimega faili_nimekiri. Operaator > ongi väljundi ümbersuunamise operaator. Kui faili, kuhu väljund suunatakse, ei ole olemas, see luuakse, kui see aga peaks eksisteerima, kirjutatakse selle varasem sisu lihtsalt üle. Pange tähele, et antud operaatoriga vaikimisi ümbersuunatav deskriptor ongi standardväljund, mistõttu seda ei ole vaja spetsiaalselt käsureal määrata. Niisiis võite käsu anda ka lihtsamal kujul:

$ ls pildid/*.png >faili_nimekiri

ning tulemus on täpselt sama. Seejärel võite vaadata tulemuseks saadud faili mõne tekstifailide näitajaga, näiteks less.

Oletame nüüd, et Te soovite teada, kui palju selliseid faile üldse on. Te ei pea neid käsitsi üle lugema, vaid võite kasutada sõnade loendamise utiliiti wc (Word Count) võtmega -l, mis näitab standardväljundis ridade arvu failis. Üks võimalus on selline:

$ wc -l 0<faili_nimekiri

mis annab just vajaliku tulemuse. Operaator < on sisendi ümbersuunamise operaator ning vaikimisi ümbersuunatav deskriptor ongi standardsisend, s.t. 0, mistõttu võite ka anda lihtsalt käsu:

$ wc -l <faili_nimekiri

Nüüd aga oletame, et soovite eemaldada kõigi failide “laiendid” ning näha tulemust omaette failis. Seda aitab teha abivahend sed (Stream EDitor). Te saadate lihtsalt programmi sed standardsisendi faili faili_nimekiri ja suunate selle väljundi tulemusfaili, s.t. faili nimekiri:

$ sed -e 's/\.png$//g' <faili_nimekiri >nimekiri

misjärel vajalik nimekiri luuaksegi ja Te võite seda vaadata just meelepärase failinäitajaga.

Mõnikord võib olla kasulik suunata ümber ka standardveaväljund. Näiteks võib Teil tekkida soov teada, millistele kataloogidele kataloogis /shared Te ligi ei pääse. Üks võimalus on lasta näidata kataloogi sisu rekursiivselt, kuid suunata vead faili, mitte aga lasta neid näidata standardväljundis (s.t. ekraanil):

$ ls -R /shared >/dev/null 2>vead

mis tähendab, et standardväljund suunatakse ümber (>) spetsiaalsesse faili /dev/null, mis tühistab kõik, mida Te kirjutate (s.t. standardväljundit ei näidata), ning standardveaväljund (2) suunatakse ümber (>) faili vead.

4.3. Torud

Torud on teatud mõttes sisendi ja väljundi ümbersuunamise kombinatsioon. Põhimõte sarnaneb reaalsete torudega (sellest ka nimi): üks protsess saadab andmed toru ühte otsa ja teine protsess loeb need toru teises otsas. Toru operaatoriks on sümbol |. Võtame uuesti ette ülaltoodud failinimekirja. Oletame, et soovite otsekohe teada vajalike failide arvu, ilma et selleks peaks nende nimekirja salvestama ajutisse faili. Seda teeb järgmine käsk:

$ ls pildid/*.png | wc -l

mis tähendab, et käsu ls standardväljund (s.t. failide nimekiri) suunatakse ümber käsu wc standardsisendisse. See annab seejärel Teile vajaliku tulemuse.

Järgmise käsuga võite vahetult koostada nimekirja “ilma laiendita” failidest:

$ ls pildid/*.png | sed -e 's/\.png$//g' >nimekiri

või kui soovite nimekirja otse uurida seda failina salvestamata:

$ ls pildid/*.png | sed -e 's/\.png$//g' | less

Torude ja ümbersuunamise kasutusala ei piirdu kaugeltki tekstiga, mida inimsilm suudaks lugeda. Kui näiteks anda järgmine käsk Terminalis:

$ xwd -root | convert - ~/minu_desktop.png

saadetakse Teie töölauast tehtud pilt faili minu_desktop.png[16] Teie kodukataloogis.



[15] Te võite arvata, et on mõttetu rääkida “failidest, mille lõpus seisab .png”, ja et selle asemel võiks öelda pigem “PNG pildid”. Kuid meenutame taas, et UNIX® korral on failidel laiend ainult moepärast: laiendid ei määra mingil moel faili tüüpi. Fail, mille lõpus seisab .png, võib väga hästi olla ka JPEG pilt, mõne rakenduse fail, tekstifail või mis tahes muu fail. Õigupoolest on see nii isegi Windows® korral!

[16] Jah, see on nüüd tõesti PNG pilt (ainult et paigaldatud peaks olema ka tarkvarapakett ImageMagick...).