Beetaversioon: sisu on enamasti terviklik ja avalikuks katsetamiseks valmis, kuid vajab veel tehnilist, keelelist ja kasutatavuse kontrolli.

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.

AlgajaradaEtapp 3/3: Ühenda oskused · peatükk 7/8

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ärkKä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

  1. Loo kolmerealine fail ning lisa neljas rida nii, et senine sisu säilib.
  2. Salvesta sama väljund faili ja näita seda samal ajal terminalis.
  3. Võrdle printf 'tere\n' | wc -l ja printf 'tere\n'; wc -l read.txt tulemust. Milliseid andmeid kumbki wc loeb?
  4. Miks veateadete peitmine ei muuda ebaõnnestunud käsku edukaks?
  5. Ennusta, kuhu lähevad vood kujul > koik.txt 2>&1 ja ü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 tekst
  • printfvorminda tekst
  • catnäita faili
  • teeekraan ja fail
  • wcloe 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 korral
  • 2>stderr eraldi faili
  • 2>&1stderr samasse kohta
  • /dev/nullmust auk väljundile

Tüüpilised kujud

  • käsk > valjund.txtstdout faili
  • käsk >> logi.txtlisa stdout faili lõppu juurde
  • käsk 2> vead.txtstderr eraldi
  • käsk > valjund.txt 2> vead.txteralda mõlemad
  • käsk 2> /dev/nullpeida veateated
  • cat fail.txt | wc -ltoru loendusse
  • käsk ; järgminejärgmine alati
  • käsk && järgminejärgmine ainult edul
  • käsk || varuplaanvaruplaan vea korral
  • käsk > koik.txt 2>&1stdout ja stderr koos