Sisend, väljund, torud ja suunamine
Käsu tulemus ei pea jääma ainult ekraanile. Seda saab salvestada faili või anda järgmisele käsule. Õpime kõigepealt andmete liikumist, seejärel käskude käivitamise tingimusi.
Väljund faili: > ja >>
Tavalist väljundit nimetatakse standardväljundiks (*stdout*). echo väljastab teksti koos reavahetusega. Märk > suunab selle faili: kui fail puudub, luuakse see; olemasolev sisu kirjutatakse üle.
Tööta oma harjutuskataloogis ja vali failinimed, mida sa veel ei kasuta:
echo esimene > read.txt
cat read.txt
Ekraanil näed teksti alles cat-i järel, sest echo väljund läks faili. Märk >> lisab standardväljundi faili lõppu, säilitades senise sisu:
echo teine >> read.txt
cat read.txt
Nüüd on failis kaks rida: esimene ja teine. Suunamismärgid ise reavahetusi ei lisa; need annab siin echo.
> Shell avab ja tühjendab > sihtfaili enne käsu käivitamist. Ära kasuta sama faili korraga sisendina ja ülekirjutatava väljundina, näiteks cat read.txt > read.txt.
Sisend failist ja torust
Standardsisend (*stdin*) on voog, millest programm saab andmeid lugeda. < annab standardsisendiks faili sisu. Käsk wc -l loendab reavahetusi; tavapärases tekstifailis on see ridade arv.
wc -l read.txt
wc -l < read.txt
Mõlemad loendavad kaks rida. Esimesel juhul näitab wc ka talle argumendina antud failinime, teisel juhul loeb anonüümset sisendvoogu.
Toru | ühendab ühe käsu standardväljundi järgmise käsu standardsisendiga. printf vormindab teksti; selle näite \n tähistab reavahetust:
printf 'üks\nkaks\nkolm\n' | wc -l
Tulemus on 3; vahepealset faili ei teki. Toru osad võivad töötada samal ajal: teine käsk loeb esimese toodetud andmeid, mitte ei oota tingimata kogu esimese käsu lõppu.
Näita ja salvesta: tee
tee kopeerib standardsisendi nii ekraanile kui ka faili. Vaikimisi kirjutab ta sihtfaili üle; -a lisab lõppu.
printf 'Tallinn\nTartu\n' | tee linnad.txt
printf 'Narva\n' | tee -a linnad.txt
wc -l linnad.txt
Näed linnanimesid kohe ning failis on lõpuks kolm rida.
Veateated eraldi: 2>
Veaväljund (*stderr*) on standardväljundist eraldi voog. 2> suunab selle faili. Eeldame, et puuduv-fail ei ole olemas:
ls read.txt puuduv-fail > valjund.txt 2> vead.txt
cat valjund.txt
cat vead.txt
Esimeses failis on leitud nimi read.txt, teises teade puuduvast failist. Tavaline toru ei suuna veateateid järgmisele käsule.
2> /dev/null viskab veaväljundi ära. /dev/null on erifail, mis andmeid ei talleta: nali „/dev/null sai täis“ ei kirjelda päris kettaruumi probleemi. Veaotsingul ära veateateid peida, sest tulemus võib muidu näida täielik ka siis, kui osa tööst ebaõnnestus.
Mõlemad vood samasse faili
ls read.txt puuduv-fail > koik.txt 2>&1
> suunab standardväljundi faili ja 2>&1 suunab veaväljundi standardväljundi praegusesse sihtkohta. Järjekord loeb: kujul 2>&1 > koik.txt jääksid vead terminali.
Lõpetuskood ja tingimuslik käivitamine
Väljundtekstist eraldi annab käsk lõpetuskoodi (*exit status*). 0 tähendab edu, nullist erinev väärtus muud tulemust, sageli viga. echo $? näitab vahetult eelmise käsu lõpetuskoodi:
ls read.txt
echo $?
ls puuduv-fail
echo $?
Esimene kood on 0, teine nullist erinev. Küsi koodi kohe: ka järgmine echo asendab selle enda lõpetuskoodiga.
| Märk | Käivitamisreegel |
|---|---|
; | oota esimese käsu lõppu, käivita siis teine ka vea korral |
&& | käivita teine ainult siis, kui esimene lõpetas koodiga 0 |
\|\| | käivita teine ainult siis, kui esimene lõpetas nullist erineva koodiga |
Katseks sobib false: see ei muuda midagi, ei prindi teksti ja lõpetab alati ebaedukalt.
false ; echo 'käivitun ikkagi'
false && echo 'seda rida ei näe'
false || echo 'käivitun ebaedu järel'
Praktiline kasutus on mkdir uus-katse && cd uus-katse: kui kataloogi loomine ebaõnnestub, ei liiguta shell sind mujale. ; ei edasta andmeid, toru | ei kontrolli eelmise käsu edu.
Minitest
- Loo kolmerealine fail ning lisa neljas rida nii, et senine sisu säilib.
- Salvesta sama väljund faili ja näita seda samal ajal terminalis.
- Võrdle
printf 'tere\n' | wc -ljaprintf 'tere\n'; wc -l read.txttulemust. Milliseid andmeid kumbkiwcloeb? - Miks veateadete peitmine ei muuda ebaõnnestunud käsku edukaks?
- Ennusta, kuhu lähevad vood kujul
> koik.txt 2>&1ja ümberpööratud järjekorras.
Peatüki täisspikker
Algaja
Eesmärk
Ühenda käske nii, et ühe väljund saab järgmise sisendiks, või saada väljund faili; vea- ja tavaväljundit tasub mõelda eraldi.
Põhikäsud
echoprindi tekstprintfvorminda tekstcatnäita failiteeekraan ja failwcloe kokku
Olulisemad lipud, märgid ja kiirnupud
>stdout faili>>lisa stdout faili lõppu juurde|anna edasi järgmisele;käivita lihtsalt järjest&&tee edasi edu korral||tee edasi vea korral2>stderr eraldi faili2>&1stderr samasse kohta/dev/nullmust auk väljundile
Tüüpilised kujud
käsk > valjund.txtstdout failikäsk >> logi.txtlisa stdout faili lõppu juurdekäsk 2> vead.txtstderr eraldikäsk > valjund.txt 2> vead.txteralda mõlemadkäsk 2> /dev/nullpeida veateatedcat fail.txt | wc -ltoru loendussekäsk ; järgminejärgmine alatikäsk && järgminejärgmine ainult edulkäsk || varuplaanvaruplaan vea korralkäsk > koik.txt 2>&1stdout ja stderr koos