Sisend, väljund, torud ja suunamine
See peatükk seletab lahti märgid, mis panevad käsud omavahel koostööd tegema.
Loogika
Kõige tähtsam mõte on lihtne:
- käsk võib midagi ekraanile kirjutada
- selle väljundi võib suunata faili
- selle väljundi võib anda teisele käsule
Need ei ole siiski kõik sama asi. Märgid >, >>, |, ;, && ja || teevad eri tööd.
1. > kirjutab faili
Kui tahad käsu väljundi faili panna, kasuta märki >.
echo tere > sonad.txt
cat sonad.txt
Siin:
echo teretoodab teksti>suunab selle failicat sonad.txtnäitab tulemust
Oluline reegel:
>kirjutab faili uue sisu ja kirjutab vana sisu üle
2. >> lisab faili lõppu
Kui tahad olemasolevale failile juurde lisada, kasuta märki >>.
echo esimene > read.txt
echo teine >> read.txt
cat read.txt
Tulemus on:
esimene
teine
Siin ongi kõige tähtsam vahe:
>kirjutab üle>>lisab lõppu
3. Toru |
Toru ei kirjuta väljundit faili. Ta saadab ühe käsu väljundi järgmise käsu sisendiks.
Näide:
printf 'üks\nkaks\nkolm\n' | wc -l
Siin:
printftoodab kolm rida- toru
|saadab need edasi wc -lloeb kokku, mitu rida tuli
See on teistsugune loogika kui failis > hoidmine.
4. Järjestikused käsud: ;
Märk ; tähendab lihtsalt: käivita järgmine käsk pärast eelmist.
pwd ; ls ; date
Siin käivitatakse kolm käsku järjest. ; ei anna andmeid ühest käsust teise edasi.
See on peamine vahe ; ja | vahel:
;käivitab käsud järjest|ühendab käsud voona
5. && ja ||
Need kaks märki lisavad käsujadale tingimuse.
&&
mkdir proov && cd proov
See tähendab: tee teine käsk ainult siis, kui esimene õnnestus.
||
grep 'midagi' puuduv.txt || echo 'otsing ebaõnnestus'
See tähendab: tee teine käsk siis, kui esimene ebaõnnestus.
Võrdlus
false ; echo 'see käivitus ikkagi'
false && echo 'seda ei näe'
false || echo 'varukäsk läks tööle'
Siin juhtub:
;järel läheb järgmine käsk alati käima&&järel järgmine käsk ei käivitu, sest esimene ebaõnnestus||järel järgmine käsk käivitub just sellepärast, et esimene ebaõnnestus
6. Vead ja 2>
Tavaline väljund ja veateated ei ole käsureal päris sama asi.
- tavaline väljund läheb tavaliselt
stdoutkaudu - vead lähevad tavaliselt
stderrkaudu
Kui tahad vead eraldi faili panna, kasuta:
ls puuduv_fail 2> vead.txt
cat vead.txt
Siin:
2>tähendab veaväljundi suunamist- tavaline väljund läheks endiselt ekraanile
7. tee
tee on kasulik siis, kui tahad väljundit korraga:
- näha ekraanil
- salvestada faili
Näide:
printf 'Tallinn\nTartu\nNarva\n' | tee linnad.txt
cat linnad.txt
Kui tahad faili lõppu lisada, kasuta:
printf 'Pärnu\n' | tee -a linnad.txt
8. 2>&1 ja muud keerulisemad kujud
Kui tahad ühendada veaväljundi tavalise väljundiga, kohtad kuju:
find . -name '*.md' > tulemused.txt 2>&1
See tähendab, et nii tavaline väljund kui ka vead lähevad samasse faili.
See ei ole enam kõige esimene kuju, mida pähe õppida, aga hea on teada, et selline võimalus on olemas.
9. Miks sudo echo ... > fail ei tööta nii, nagu algaja ootab
Paljud proovivad kuju:
sudo echo 'naide=1' > /etc/naide.conf
Aga siin teeb ümbersuunamise > sinu praegune shell, mitte sudo.
Sellepärast kasutatakse sageli hoopis sellist kuju:
echo 'naide=1' | sudo tee /etc/naide.conf
Peamine loogika on:
sudo echo ... > failei anna root-õigust shelli suunamiselesudo tee failavab faili protsessis, millel on vajalikud õigused
10. Kui väljund ei ilmu kohe
Mõni programm ei kirjuta iga rida kohe ekraanile või torusse edasi, vaid kogub väljundi vahepeal puhvrisse.
See tähendab:
- terminalis töötav programm võib näidata ridu kohe
- sama programm toru või faili kaudu võib väljundi edasi anda hiljem
Pythoni puhul kohtab seda sageli. Selleks on olemas näiteks:
python3 -u programm.pyprint(..., flush=True)
See on juba natuke järgmise taseme teema, aga hea on teada, miks mõni toru “vaikib” kauem kui ootasid.
Minitest
- Loo fail käsuga
echo tere > fail.txt. - Lisa teine rida käsuga
echo maailm >> fail.txt. - Näita faili sisu käsuga
cat. - Ühenda kaks käsku toruga, näiteks
printf ... | wc -l. - Võrdle käske
pwd ; lsjapwd | ls. - Proovi, kuidas
false && echo okerineb käsustfalse || echo ok.