Mustand: sisu ei ole veel tehniliselt ega keeleliselt täielikult kontrollitud ega toimetatud.

Peatüki vaade

Linux/Unix/macOS käsurea kiirõpik

Praegu loed peatükki Sisend, väljund, torud ja suunamine, mis kuulub osasse Osa I: Esimesed sammud.

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 tere toodab teksti
  • > suunab selle faili
  • cat sonad.txt nä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:

  • printf toodab kolm rida
  • toru | saadab need edasi
  • wc -l loeb 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 stdout kaudu
  • vead lähevad tavaliselt stderr kaudu

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 ... > fail ei anna root-õigust shelli suunamisele
  • sudo tee fail avab 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.py
  • print(..., flush=True)

See on juba natuke järgmise taseme teema, aga hea on teada, miks mõni toru “vaikib” kauem kui ootasid.

Minitest

  1. Loo fail käsuga echo tere > fail.txt.
  2. Lisa teine rida käsuga echo maailm >> fail.txt.
  3. Näita faili sisu käsuga cat.
  4. Ühenda kaks käsku toruga, näiteks printf ... | wc -l.
  5. Võrdle käske pwd ; ls ja pwd | ls.
  6. Proovi, kuidas false && echo ok erineb käsust false || echo ok.