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

Praktiline teatmeteos

Linux/Unix/macOS käsurea kiirõpik

Autor: ChatGPT

Teda abistas: Jaak Vilo

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

Laadi samast kataloogist PDF

Saada tagasisidet: soovitused ja murekohad

Kolofon

Linux/Unix/macOS käsurea kiirõpik

Autor: ChatGPT

Teda abistas: Jaak Vilo

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

Versioon
v0.3.0-beta.1
Kood
v0.3.0-beta.1-18-g656f5c3
Versioonikirje (commit)
656f5c3
Märgend (tag)
v0.3.0-beta.1
Kuupäev
2026-09-11 14:32:20 EEST

Kuidas seda õpikut kasutada

Õpi käsureal tegema nähtava tulemusega tööd: leia failid, töötle teksti, kasuta kaugmasinat ja automatiseeri korduvaid samme. Õpik sobib nii järjest õppimiseks kui ka hilisemaks käsiraamatuks.

Vali oma algus

  • Täiesti algaja: alusta terminali esimestest sammudest. Esimesel korral piisab 20–30 minutist: vaata infot, liigu kataloogide vahel ja loo oma harjutuskoht. Giti, Dockerit ega süsteemihaldust ei pea veel tundma.
  • Põhikäskudega tuttav: vali õpiteede hulgast oma eesmärk, näiteks failihaldus, tekstitöötlus või arendus.
  • Otsid kiiret vastust: kasuta peatükkide lõpu spikreid ja spikrite registrit. Enne muutvat käsku loe ka selle hoiatus.

Harjutamiseks sobib oma Linuxi või macOS-i terminal, Windowsis WSL-i Linuxi shell ning brauseris terminal.cs.ut.ee. Brauserikeskkonnas on ka valmis ülesanded.

CLI ja GUI

CLI (*command-line interface*) on käsurealiides: annad juhiseid tekstina. GUI (*graphical user interface*) on graafiline kasutajaliides: kasutad aknaid, nuppe ja menüüsid. Need on eri viisid sama töö tegemiseks, mitte paremate ja halvemate kasutajate tunnused.

Käsureal suhtled tavaliselt terminali kaudu shelli ehk käsutõlgiga. Nende rollid ja shelli kuvatav viip saavad selgeks esimeste käskude juures.

Kuidas näidet kasutada

  1. Loe, mida käsk teeb ning kas ta muudab faile.
  2. Katseta oma harjutuskataloogis. Kopeeri käsk, mitte viip või näidisväljund.
  3. Võrdle tulemust seletusega. Failiteed, kuupäevad ja kasutajanimed võivad sinu arvutis erineda.
  4. Tee minitest: muuda sisendit või ennusta väljundit enne käivitamist.

Kui ühes näites on Linuxi ja macOS-i alternatiivid, vali ainult oma süsteemi oma. Nimed nagu kasutaja@server ja fail.txt tuleb sobitada oma ühenduse või olemasoleva failiga. Ära käivita tundmatut koodi pelgalt sellepärast, et see on kopeeritav.

Täpsed mõisted leiad sõnastikust, põhjalikuma dokumentatsiooni lisalugemise viidetest.

Peatüki täisspikker

Algaja

Eesmärk

Saa aru, mis on terminal, shell, CLI ja GUI, ning vali rahulik algusrada enne keerulisemaid töövooge.

Põhitee

Põhimõisted

  • CLIkäsurida
  • GUIgraafiline liides
  • terminalaken käsureaks
  • shelltõlgendab käske

Tüüpilised kujud

  • pwdkontrolli asukohta
  • lsvaata sisu
  • man lsloe abi
  • cd ~/tmpmine ajutiste failide kataloogi; sobib harjutamiseks

Õpitee ja õppetunnid

See peatükk aitab valida, mis järjekorras lugeda. Raamatut saab kasutada ka käsiraamatuna, kuid alguses on lihtsam liikuda kindla õpitee järgi.

Kui tahad liikuda rahulikult lihtsamast keerulisemani, alusta peatükist Terminali esimesed sammud. Peatükk Esimene tervikharjutus: 30 minutit on mõeldud hilisemaks, kui põhioskused on juba omandatud.

Õpitee 1: täiesti algaja

Alusta siit, kui käsurida on uus. Loe igas etapis peatükke antud järjekorras ja katseta näiteid oma harjutuskataloogis. Kõike ei pea ühe korraga läbima.

1. Tutvu ja liigu

  1. Terminali esimesed sammud
  2. Abi leidmine
  3. Kataloogid ja failid

Nüüd oskad: leida oma asukoha, liikuda kataloogides, luua harjutuskoha ja avada käsu juhendi.

2. Tööta failidega

  1. Teksti vaatamine ja liikumine
  2. Failide muutmine
  3. Käskude kuju ja argumentide loogika

Nüüd oskad: faili lugeda ja muuta ning eristada käsu nime, valikuid ja argumente.

3. Ühenda oskused

  1. Sisend, väljund, torud ja suunamine
  2. Esimene tervikharjutus: 30 minutit

Nüüd oskad: salvestada väljundi faili, ühendada käske ja kontrollida oma töö tulemust.

Kui mõni kontrollpunkt jäi ebakindlaks, korda vastava etapi näidet. Muidu jätka allpool süsteemipildi loomisega; Giti, Dockerit ja süsteemihaldust ei pea enne põhioskusi õppima.

Õpitee 2: süsteemipildi loomine

Staatus: vajalik pärast esimest ringi.

Kui põhioskused on omandatud, liigu siia:

  1. Linux, Unix, GNU, macOS, Windows ja shellid
  2. Failisüsteemi kaart
  3. Kettaruum ja süsteemi maht
  4. Õigused, omanikud ja täitmisbitid
  5. Kasutajad, grupid ja sudo
  6. Muutujad, keskkond, PATH ja aliased
  7. Paketihaldus: apt, dnf, pacman, brew
  8. Lihtne veaotsing käsureal
  9. Võrgu põhitööriistad

See plokk aitab süsteemi „musta kasti“ lahti võtta.

Pärast seda rada oskad:

  • paigutada tähtsamad süsteemikaustad ja tööriistad õigesse konteksti
  • lugeda õigusi, kasutajaid ja PATH-i ilma liigse müstikata
  • aru saada, kust tulevad paketid, käsud ja paljud tüüpilised vead

Õpitee 3: igapäevane Linuxi ja serveri kasutaja

Staatus: soovitatav, kui töötad serverite, kaugühenduste või suuremate failipuudega.

Kui tahad teha igapäevatöid masinate, failide ja kaugühendustega, vaata eriti neid peatükke:

  1. Failide kopeerimine ja sünkroonimine
  2. Kauglogimine ja SSH
  3. Veebist sisu toomine ja tekstivaade: curl, wget, lynx
  4. Arhiivid ja pakkimine
  5. Tervete kataloogipuude haldus ja jagamine
  6. Protsessid, tööd ja signaalid
  7. Logid ja teenused
  8. Püsivad terminalisessioonid: tmux ja screen

See rada on seotud praktilise süsteemikasutusega:

  • failid liiguvad masinate vahel
  • protsessid võivad kinni jääda või kaua joosta
  • logidest tuleb probleeme otsida
  • katkestuste vastu on vaja püsivaid sessioone

Pärast seda rada oskad:

  • kopeerida faile ja katalooge masinate vahel
  • logida sisse SSH kaudu ja kasutada võtmeid turvalisemalt
  • lugeda logisid ning hallata pikemalt jooksvaid töid

Õpitee 4: tekst, filtrid ja automatiseerimine

Staatus: soovitatav kohe pärast põhiosa, kui tahad käsurea võimalusi laiemalt kasutada.

Kui tahad õppida Unix-laadsete tekstivoogude töötlemise tööriistu, liigu nii:

  1. Teksti otsimine: grep ja sugulased
  2. Teksti teisendamine: tr, cut, paste, column, strings
  3. Vood ja tabelid: sort, uniq, wc, pr, join
  4. sed, awk ja perl praktiliselt
  5. find ja xargs ohutumalt
  6. Esimene shelliskript
  7. cron ja ajastatud tööd

See on üks tähtsamaid õpiteid, sest siin õpid väikseid tööriistu terviklikuks töövooks ühendama.

Pärast seda rada oskad:

  • otsida ja filtreerida ridu mustri järgi
  • sortida, loendada ja teisendada tekstivooge
  • kirjutada esimesi lühikesi shelliskripte ja ajastatud töid

Õpitee 5: arendaja suund

Staatus: soovitatav, kui kasutad käsurida tarkvaraprojektides.

Kui eesmärk on tarkvara arendamine, vaata pärast põhiosa eriti neid peatükke:

  1. Git, GitHub ja töövoog
  2. Pythoni venv ja eraldatud keskkonnad
  3. Dockeri alused
  4. IDE-d ja arenduskeskkonnad
  5. Andmeteaduse eelteadmised käsurea vaates
  6. CSV, JSON ja XML käsureal
  7. Andmebaasi algus: sqlite ja Python
  8. Kompileerimine ja käivitamine: shell, Python, C, C++, Go, Rust, Java
  9. LaTeX käsurealt

See järjekord on mõistlik:

  • Git tuleb peaaegu igas projektis enne
  • venv aitab projekti sõltuvused korras hoida
  • Docker ja IDE on mugavus- ning töövooteemad
  • andmeteaduse eelteadmiste osa aitab siduda käsurea, failivormingud ja SQL-i
  • SQLite, kompileerimine ja LaTeX näitavad, kuidas käsurida seob andmed, programmid ja dokumendid üheks töövooks

Pärast seda rada oskad:

  • hoida projekti muudatusi Gitis korras
  • isoleerida sõltuvusi ja arenduskeskkondi
  • lugeda, käivitada ja ehitada mitut tüüpi arendusprojekte

Õpitee 6: andmeteaduse stardirada

Staatus: soovitatav, kui tahad käsurida kasutada andmete puhastamiseks ja uurimiseks.

Kui eesmärk on andmeteadus või andmeanalüüs, vaata pärast käsurea põhiosa eriti neid peatükke:

  1. Sisend, väljund, torud ja suunamine
  2. Teksti otsimine: grep ja sugulased
  3. Teksti teisendamine: tr, cut, paste, column, strings
  4. Vood ja tabelid: sort, uniq, wc, pr, join
  5. Andmeteaduse eelteadmised käsurea vaates
  6. CSV, JSON ja XML käsureal
  7. Andmebaasi algus: sqlite ja Python
  8. Pythoni venv ja eraldatud keskkonnad

See rada on hea, sest:

  • kõigepealt õpid andmeid failidest lugema ja filtreerima
  • siis saad aru, mis vahe on tabelil, JSON-il ja XML-il
  • pärast seda muutub SQL palju loomulikumaks
  • lõpuks saad sama töövoo viia Pythoni projekti või andmetöötlusse

Pärast seda rada oskad:

  • töödelda tekstifaile ja tabeleid käsureal
  • eristada CSV-d, JSON-i ja XML-i
  • teha esimesi SQL-päringuid ning siduda need Pythoni töövooga

Kiirtee: varasemate oskuste värskendamiseks

Eeldused: oskad juba faile vaadata ja muuta ning tunned argumente ja jutumärke. Täiesti algajana vali eespool Õpitee 1, mis ei jäta neid samme vahele.

Vaata peatükke selles järjekorras:

  1. Terminali esimesed sammud
  2. Abi leidmine: man, --help ja info
  3. Kataloogid ja failid
  4. Sisend, väljund, torud ja suunamine
  5. Lihtne veaotsing käsureal
  6. Failide kopeerimine ja sünkroonimine
  7. Kauglogimine ja SSH
  8. Logid ja teenused
  9. Git, GitHub ja töövoog

Pärast seda kiirteed oskad juba:

  • liikuda terminalis kindlamalt ja otsida rahulikult abi
  • kopeerida faile, ühendada käske torudega ja lugeda lihtsamaid veateateid
  • logida serverisse, kopeerida faile masinate vahel ja vaadata logidest, mis toimub
  • teha väikese muudatuse Gitis ning kontrollida enne versioonikirje loomist, mis täpselt muutus

Millal kasutada raamatut teatmeteosena

Kui oled juba baasi läbinud, siis ei pea enam liikuma õpitee järgi. Siis on parem kasutada peatükke probleemipõhiselt:

Peatüki täisspikker

Algaja

Eesmärk

See peatükk aitab valida, mis järjekorras lugeda. Raamatut saab kasutada ka käsiraamatuna, kuid alguses on lihtsam liikuda kindla õpitee järgi.

Õpiteed

  • Täiesti algajaloe esimesena
  • Süsteemi pildi loominepärast esimest ringi
  • Igapäevane Linuxi ja serveri kasutajakaugühendus ja failid
  • Tekst, filtrid ja automatiseeriminekäsurea jõud
  • Arendaja suundGit, Docker, koostamine
  • Andmeteaduse stardiradafailid, vormingud, SQL

Märgendid ja kontroll

  • vajalikloe nüüd
  • soovitatavhea järgmine
  • hiljemära kiirusta
  • Pärast seda rada oskad …kontrolli edenemist

Terminali esimesed sammud

Alustame käskudest, mis ainult näitavad infot. Seejärel loome oma harjutuskataloogi ja õpime nimesid vähem trükkima.

Terminal, shell ja viip

Terminal on aken või rakendus, kus sisestad teksti ja näed väljundit. Shell ehk käsutõlk on selles töötav programm, näiteks Bash või zsh: ta tõlgendab käsurida ning käivitab programmi või oma sisekäsu. Sama terminalirakendusega saab kasutada erinevaid shelle.

Viip ehk *prompt* näitab, et shell ootab järgmist käsku. Näites on viip kasutaja@arvuti:~$ ja sisestatud käsk pwd:


kasutaja@arvuti:~$ pwd
/home/kasutaja

Viip võib näidata kasutajat, arvuti nime ja kataloogi; ~ tähistab kodukataloogi. Selle välimus on muudetav ega tõenda iseenesest sinu asukohta või õigusi.

> Ära kopeeri viipa kaasa. Sisesta ainult käsk, siin pwd, ja vajuta Enter. Väljundiridu terminali tagasi ei sisestata.

Esimesed ohutud käsud

Proovi tabeli käske ükshaaval. Need ei muuda faile.

KäskMida näed
pwdpraeguse kataloogi täielik tee
lsselle kataloogi failide ja alamkataloogide nimed
whoamisinu kasutajanimi
datepraegune kuupäev ja kellaaeg

Kui ls ei väljasta midagi, võib kataloog olla tühi või sisaldada ainult peidetud kirjeid.

Terminalis näitavad pwd, ls, whoami ja date asukohta, kataloogi sisu, kasutajat ning aega.
Terminalis näitavad pwd, ls, whoami ja date asukohta, kataloogi sisu, kasutajat ning aega.
  1. pwd väljastab töökoha tee.
  2. ls loetleb seal olevad nimed, mitte failide sisu.
  3. whoami ja date vastavad kumbki ühe reaga; uus viip näitab, et käsk on lõpetanud.

Valmis harjutuskeskkond

terminal.cs.ut.ee pakub terminali ja sissejuhatavaid ülesandeid brauseris. Seal saad alustada ka oma arvutisse Linuxit paigaldamata.

Tartu Ülikooli harjutuskeskkonna ülesanded ja terminal.
Tartu Ülikooli harjutuskeskkonna ülesanded ja terminal.

Vali vasakult ülesanne, sisesta parempoolsesse terminali käsk ning võrdle tulemust ülesande nõudega. Veebikeskkonna failid ei ole sinu enda arvuti failid.

Käsu nimi ja argument

Käsureas ls /etc on ls käsu nimi ja /etc argument: kataloog, mille sisu soovid näha. ls üksi vaatab praegust kataloogi. Lisa -l annab pikema loendi, kus on ka õigused, suurus ja muutmisaeg:


ls /etc
ls -l /etc

-l on valik ehk lipp, mitte failinimi. Enamasti kirjutatakse kõigepealt käsk, siis valikud ja seejärel argumendid. Üksikasjad tulevad peatükis Käskude kuju ja argumentide loogika.

Liikumine ja esimene oma kataloog

cd muudab shelli töökataloogi, mitte kataloogi asukohta kettal.

KujuTulemus
cd ~mine kodukataloogi
cd ..mine ülemkataloogi
cd /mine juurkataloogi
cd proovmine praeguse kataloogi alamkataloogi proov

mkdir loob kataloogi. Tee kodukataloogi oma harjutuskoht:


cd ~
mkdir proov
cd proov
pwd
ls

pwd väljund lõpeb nüüd /proov. mkdir ja cd on õnnestudes tavaliselt vaiksed; tühi ls väljund kinnitab, et uues kataloogis pole veel nähtavaid faile. Kui nimi proov on juba kasutusel, vali uus nimi ja kasuta seda ka cd käsus.

Tab aitab pikki nimesid lõpetada

Loo harjutuskataloogi kaks alamkataloogi:


mkdir pildid-loodus pildid-linn

Kirjuta käsureale cd pil, kuid ära vajuta veel Enter. Vajuta Tab. Shell täiendab nime ühise alguseni või näitab võimalikke vasteid. Kui real on nüüd cd pildid-l, lisa ood ja vajuta uuesti Tab: alles jääb üks vaste, pildid-loodus. Kui automaatset täiendust ei tulnud, kirjuta ise cd pildid-lood ja proovi uuesti. Alles täieliku nime järel vajuta Enter ja kontrolli asukohta käsuga pwd.

Tab on klahv: sõna Tab ega märgendeid <Tab> käsureale ei kirjutata. Kui midagi ei juhtu, võib vasteid olla mitu või mitte ühtegi. Kontrolli kirjapilti, lisa mõni täht või vajuta Tab uuesti. Täpne käitumine sõltub shelli seadistusest.

Ajalugu, abi ja katkestamine

history kuvab käsuajaloo. Ülesnool toob varasema käsu muutmiseks ette; allanool liigub uuema poole. Ctrl-r alustab ajaloootsingut: kirjuta osa käsust. Kontrolli leitud käsk enne Enter-it üle. Ajaloo pikkus sõltub varasemast kasutusest ja shelli seadistusest.

man ls avab käsu ls käsiraamatu. Välju klahviga q. Kui käsiraamatut ei leita, vaata järgmise peatüki abijuhist.

KlahvToiming tavapärases Bashi või zsh käsurearedaktoris
Ctrl-ckatkesta programmi töö või pooleli olev sisestus
Ctrl-a / Ctrl-eliigu käsurea algusse / lõppu
Ctrl-klõika tekst kursorist rea lõpuni

Need käsurea liikumisklahvid võivad eriseadistuse korral erineda. Ctrl-c ei võta juba tehtud failimuudatusi tagasi.

> Ära käivita veebist või vestlusest kopeeritud käsku, mille mõtet sa ei tea. Eriti ohtlik on alla laaditud koodi kohe käivitada: programm saab kasutada sinu õigusi ja lugeda sinu faile.

Minitest

  1. Mille poolest erinevad pwd ja viibas olev katalooginimi?
  2. Kas ls /etc muudab sinu töökohta? Kontrolli enne ja pärast käsuga pwd.
  3. Liigu loodud pildikataloogist ülemkataloogi ja vali Tab-iga teine pildikataloog.
  4. Too ajaloost ette ls /etc, lisa valik -l ning võrdle tulemust.

Peatüki täisspikker

Algaja

Eesmärk

Vaata kõigepealt rahulikult, kus sa oled, kes sa oled ja mis selles kataloogis on; alles siis tee esimene väike muudatus.

Käsud ja esimesed sammud

  • pwdvaata asukohta
  • lsvaata sisu
  • whoamivaata kasutajat
  • datevaata praegust kuupäeva ja aega
  • historyvaata käsuajalugu
  • cd ~/tmpmine ajutiste failide kataloogi; sobib harjutamiseks
  • mkdir proovloo uus kataloog
  • cd proovsisene loodud kataloogi

Olulisemad lipud, märgid ja kiirnupud

  • Tablõpeta nimi
  • Ctrl-ckatkesta programmi töö
  • Ctrl-rotsi ajaloost
  • Ctrl-area algus
  • Ctrl-erea lõpp
  • ~/proov %näide viibast ehk promptist

Abi leidmine: man, --help ja info

Käsu kohalik dokumentatsioon kirjeldab tavaliselt just sinu arvutisse paigaldatud varianti. Alusta sellest, mitte juhusliku veebinäite kopeerimisest.

Vali sobiv abi

KujuMida saad
man lskäsu ls lehitsetav käsiraamat
ls --helpGNU ls kasutusjuhis terminalis; macOS-i ls seda valikut ei toeta
whatis lskäsiraamatu lühikirjeldus
apropos copymärksõnale copy vastavad käsiraamatukirjed
info coreutilsGNU põhikäskude pikem dokumentatsioon, kui see on paigaldatud

--help on levinud, mitte universaalne valik. Ka -h ei tähenda alati abi: näiteks ls -h muudab suuruste esitusviisi. Suur- ja väiketäht on eri valikud.

Esimene käsiraamat

Ava man ls. Alguses näed tavaliselt pealkirja LS(1): käsu nimi ning käsiraamatu jaotis, siin kasutajakäsud. Jaotis NAME ütleb lühidalt, mida käsk teeb; SYNOPSIS näitab süntaksit ja DESCRIPTION selgitab valikuid.

Tavapärases lehitsejas saad liikuda nii:

KlahvToiming
tühik / blehekülg edasi / tagasi
/-a ja Enterotsi valikut -a
njärgmine otsinguvaste
qvälju tagasi käsureale

Otsi -a seletus üles, välju ja võrdle ls ning ls -a väljundit. Nii kasutad dokumentatsiooni konkreetse küsimuse lahendamiseks.

Kui abi ei leita

Kui man puudub või ütleb No manual entry, võib puududa käsiraamatupakett, mitte käsk ise. whatis ja apropos kasutavad samuti kohalikku dokumentatsiooniandmebaasi; need ei asenda puuduvat juhendit.

Proovi käsu dokumenteeritud abivalikut või ava ametlik juhend. Vajadusel paigalda hiljem dokumentatsioon paketihalduriga. Ära proovi tundmatu käsu valikuid juhuslikult: mõni neist võib midagi muuta.

Shelli sisekäsu abi võib olla shelli enda juhendis. Näiteks Bashis selgitab help cd käsku cd; zsh-s vaata man zshbuiltins. help ei ole kõigi shellide ühine käsk.

Kui käsu nime ei mäleta

apropos archive otsib käsiraamatute kirjeldustest sõna archive. Tulemus on kandidaatide loend, mitte soovitus kõiki käske käivitada. Vali nime ja lühikirjelduse järgi sobiv kirje ning ava selle man-leht.

GNU tööriistade põhjalikum juhend võib olla info-vormingus. Käsk info coreutils avab selle, kui dokumentatsioon on olemas; h näitab kasutusabi ja q väljub.

Minitest

  1. Leia man ls abil, mida teeb valik -l, ning proovi seda.
  2. Mida tähendab pealkirjas LS(1) olev number?
  3. Leia apropos-iga kopeerimisega seotud käsk. Kas selle nimi üksi ütleb, mida see kopeerib?
  4. Miks pole -h turvaline universaalne viis abi küsimiseks?

Peatüki täisspikker

Algaja

Eesmärk

Leia tundmatu käsu tähendus ja oma süsteemis toetatud valikud.

Käsud ja näited

  • man lslehitsetav käsiraamat; alusta jaotistest NAME ja SYNOPSIS
  • ls --helpGNU ls-i kiire abi; macOS-i ls kasutab man-lehte
  • whatis lskäsu ühe rea kirjeldus
  • apropos archiveotsi käsiraamatute kirjeldustest
  • info coreutilsGNU põhikäsud, kui dokumentatsioon on paigaldatud

Märgid ja valikud

  • qvälju man-i lehitsejast
  • /tekstotsi man-lehelt; kinnita Enteriga
  • n / Njärgmine / eelmine otsinguvastus

Kataloogid ja failid

Unix-laadses süsteemis taandub suur osa tööst failide ja kataloogidega tegelemisele. Selles peatükis teed esimesed tegelikud muudatused, kuid kontrollitult.

Kiire orientiir

Käsk või märkMilleksMida tavaliselt näed
pwdnäita praegust kataloogiüks täistee
lsloetle kataloogi sisunimed või tühi väljund
cd kataloogliigu kataloogiedukal juhul sageli vaikne
mkdir kataloogloo üks kataloogedukal juhul sageli vaikne
mkdir -p tee/kataloogloo vajadusel terve puuduv teeedukal juhul sageli vaikne
touch fail.txtloo tühi fail või uuenda ajatemplitedukal juhul sageli vaikne
cp a.txt b.txtkopeeri failedukal juhul sageli vaikne
mv vana uusnimeta ümber või liigutaedukal juhul sageli vaikne
rm fail.txtkustuta fail ilma prügikastitaedukal juhul sageli vaikne
rmdir kataloogkustuta tühi kataloogedukal juhul sageli vaikne

Tühi väljund ei tähenda automaatselt viga. Paljud failikäsud ütlevad midagi ainult siis, kui midagi läks valesti.

Tüüpilised algaja vead

  • pwd jääb vaatamata ja fail luuakse valesse kohta
  • tühikuga nimi jäetakse jutumärkideta
  • mv käsu puhul ei märgata, kas tegu on ümbernimetamise või liigutamisega
  • arvatakse, et rm viib faili prügikasti
  • kasutatakse rm -rf, sest see „töötab alati“, mõistmata, kui palju see võib kustutada

Tee endale harjutuskataloog

Ära harjuta esimesi kustutamis- ja liigutamiskäske päris projektikataloogis. Tee eraldi harjutuskoht.


pwd
mkdir -p ~/tmp/faili-naited
cd ~/tmp/faili-naited
pwd
ls

Siin:

  • ~ tähendab sinu kodukataloogi
  • mkdir -p ~/tmp/faili-naited loob vajadusel ka vahekataloogi tmp
  • kui tmp või faili-naited oli juba olemas, ei ole see viga
  • viimane pwd kinnitab, et oled õiges kohas

mkdir -p on hea harjutuskäsk just sellepärast, et ta teeb puuduva tee valmis. Ilma -p-ta oskab mkdir luua ainult viimase kataloogi siis, kui vahepealne tee on juba olemas.

Teed: ., .. ja ~

Kolm märki tulevad failitöös pidevalt tagasi.

KujuTähendus
.praegune kataloog
..ülemine kataloog
~sinu kodukataloog

Näited:


pwd
cd ..
pwd
cd ~/tmp/faili-naited
pwd

Kui käsk kasutab kuju ./fail.txt, tähendab see faili fail.txt siinsamas praeguses kataloogis. See on sama fail, mida tähistab ka lihtsalt fail.txt, aga ./ teeb asukoha nähtavamaks.

Failinimed ja tühikud

Shell jagab käsu tühikute kohalt osadeks. Kui faili või kataloogi nimes on tühik, pane nimi jutumärkidesse.


mkdir "Minu failid"
cd "Minu failid"
touch "esimene fail.txt"
ls
cd ..

Algajana on lihtsam kasutada failinimedes sidekriipsu või alakriipsu:


minu-failid
esimene_fail.txt

Tühikutega nimed on lubatud, aga käsureal nõuavad need rohkem tähelepanu.

Kataloogi sisu vaatamine

ls on kõige tavalisem esimene vaade.


ls
ls -l
ls -a
ls -la
ls -A

Nende vahe:

  • ls näitab tavalisi nimesid
  • ls -l näitab detailvaadet
  • ls -a näitab ka punktiga algavaid peidetud nimesid
  • ls -la ühendab detailvaate ja peidetud nimed
  • ls -A näitab peidetud nimesid, aga jätab . ja .. välja
Terminali näide, kus võrreldakse käske `ls`, `ls -a` ja `ls -al` ning nähakse ka olukorda, kus `mkdir tmp` annab teate `File exists`.
Terminali näide, kus võrreldakse käske ls, ls -a ja ls -al ning nähakse ka olukorda, kus mkdir tmp annab teate File exists.

Selles aknas on oluline järjekord:

  1. pwd näitab praegust asukohta
  2. mkdir tmp proovib luua kataloogi, aga saab teate File exists
  3. see ei ole ohtlik viga, vaid tähendab, et kataloog oli juba olemas
  4. cd tmp liigub olemasolevasse kataloogi
  5. ls näitab tavalist sisu
  6. ls -a lisab . ja ..
  7. ls -al näitab sama pika detailvaatena

Punktiga algavad nimed

Punktiga algavad nimed on tavaliselt peidetud:

  • .zshrc
  • .ssh
  • .git
  • .config

Need ei ole kadunud ega erilise kaitse all. See on kuvamiskokkulepe: paljud tööriistad jätavad punktiga algavad nimed vaikimisi näitamata.


mkdir -p ~/tmp/peidetud-naide
cd ~/tmp/peidetud-naide
touch tavaline.txt .peidetud.txt
ls
ls -a
ls -A
Terminali näide, kus kõigepealt võrreldakse käske `ls`, `ls -a` ja `ls -al`, seejärel luuakse peidetud fail `.peidetud.txt` ja vaadatakse sama kausta sisu uuesti.
Terminali näide, kus kõigepealt võrreldakse käske ls, ls -a ja ls -al, seejärel luuakse peidetud fail .peidetud.txt ja vaadatakse sama kausta sisu uuesti.

Pildi põhisõnum on lihtne:

  • punktiga algav fail on olemas
  • tavaline ls ei pruugi seda näidata
  • ls -a või ls -A teeb peidetud nimed nähtavaks

macOS Finderis saab peidetud failide kuvamist lülitada klahviga:


Command-Shift-.

Loo, kopeeri, nimeta ümber ja liiguta

Nüüd tee väike tervikharjutus samas harjutuskataloogis.


cd ~/tmp/faili-naited
pwd
touch esimene.txt
cp esimene.txt koopia.txt
mkdir arhiiv
mv koopia.txt arhiiv/
ls
ls arhiiv

Siin:

  • touch esimene.txt loob tühja faili, kui seda veel ei ole
  • cp esimene.txt koopia.txt teeb koopia
  • mkdir arhiiv loob kataloogi
  • mv koopia.txt arhiiv/ liigutab faili kataloogi arhiiv

Kui käsk õnnestub, ei pruugi ta midagi öelda. Tulemuse kontrollimiseks kasuta ls.

mv teeb kaks eri asja

mv võib tähendada ümbernimetamist:


mv vana.txt uus.txt

Sama käsk võib tähendada liigutamist:


mv fail.txt arhiiv/

Eristus tuleb viimasest argumendist:

  • kui lõpus on uus failinimi, nimetad ümber
  • kui lõpus on kataloog, liigutad sinna sisse

Kui kahtled, tee enne:


ls -l
ls -l arhiiv

touch ja ajatempel

touch teeb kaks asja:

  • kui faili ei ole, loob tühja faili
  • kui fail on olemas, uuendab tavaliselt faili muutmisaega

Näide:


touch tyhi.txt
cat tyhi.txt
ls -l tyhi.txt

cat tyhi.txt ei näita midagi, sest fail on tühi. See on normaalne.

Kui tahad näha, millised failid on viimati muutunud, kasuta:


ls -lt

ls -lt sorteerib detailvaate aja järgi.

Terminal ja Finder näitavad sama kohta

Terminal ja graafiline failihaldur ei ole eri maailmad. Nad võivad näidata sama kataloogi.

macOS-is ava praegune kataloog Finderis nii:


open .
Finder ja terminal näitavad sama kataloogi: terminalis liigutakse kataloogi, avatakse sama koht käsuga `open .`, luuakse tühi fail `uus.txt`, kirjutatakse faili `teine.txt` üks rida ning võrreldakse tulemust Finderis ja terminalis.
Finder ja terminal näitavad sama kataloogi: terminalis liigutakse kataloogi, avatakse sama koht käsuga open ., luuakse tühi fail uus.txt, kirjutatakse faili teine.txt üks rida ning võrreldakse tulemust Finderis ja terminalis.

Selles näites:

  1. cd ~/uuskaust/pildid liigub kindlasse kataloogi
  2. pwd kontrollib asukoha üle
  3. open . avab sama kataloogi Finderis
  4. touch uus.txt loob tühja faili
  5. echo "siin on ka teksti" > teine.txt loob tekstiga faili
  6. ls ja ls -al näitavad samu faile terminalis
  7. Finder näitab sama tulemust graafiliselt

Õppetund: kui fail tekib terminalis, näed seda tavaliselt ka Finderis, ja vastupidi.

Kustutamine: rm, rmdir, rm -r

Kustutamine on selle peatüki kõige riskantsem osa.

Enne kustutamist tee alati:


pwd
ls

Üksik fail:


rm fail.txt

Tühi kataloog:


rmdir tyhi-kataloog

Kataloog koos sisuga:


rm -r vana-kataloog

rmdir on algajale hea, sest ta töötab ainult tühja kataloogiga. Kui kataloogis on midagi sees, käsk peatub.

rm -r läheb kataloogi sisse ja kustutab rekursiivselt ka selle sisu. Seda kasuta ainult siis, kui oled teinud pwd ja ls kontrolli.

Miks rm -rf on eraldi ohtlik

Kuju:


rm -rf vana-kataloog

tähendab:

  • -r kustutab rekursiivselt
  • -f sunnib kustutamist ja vähendab küsimist

Käsureal ei ole vaikimisi Finderi või Windows Exploreri prügikasti. Kui rm õnnestub, on fail tavakasutuse mõttes kohe läinud.

Hea algaja rusikareegel:

  • fail: rm fail.txt
  • tühi kataloog: rmdir kataloog
  • kataloog koos sisuga: rm -r kataloog
  • rm -rf: ainult siis, kui saad täpselt aru, miks seda vajad

Minitest

  1. Loo harjutuskataloog ~/tmp/faili-naited.
  2. Mine selle kataloogi sisse ja kontrolli asukohta käsuga pwd.
  3. Loo fail readme.txt.
  4. Tee failist koopia nimega readme.bak.
  5. Nimeta koopia ümber nimeks vana.txt.
  6. Loo peidetud fail .salajane.
  7. Võrdle käske ls, ls -a ja ls -A.
  8. Kustuta üks tavaline fail alles pärast pwd ja ls kontrolli.
  9. Loo tühikuga failinimi ja nimeta fail ümber. Kuidas hoiad nime ühe argumendina?

Peatüki täisspikker

Algaja

Eesmärk

Failitöö põhiharjumus on: kontrolli asukohta, tee üks väike muudatus, vaata tulemus üle ja kustuta alles pärast teadlikku pausi.

Põhikujud

  • pwdkontrolli asukohta
  • lsvaata sisu
  • mkdir -p ~/tmp/faili-naitedloo terve puuduv tee
  • cd ~/tmp/faili-naitedmine harjutama
  • touch fail.txtloo puuduv fail või uuenda ajatempleid
  • cp algne.txt koopia.txttee koopia
  • mv vana.txt uus.txtnimeta ümber
  • mv fail.txt kaust/liiguta kataloogi
  • rm fail.txtkustuta fail
  • rmdir tyhi-kataloogeemalda tühi kataloog

Olulisemad lipud, märgid ja kiirnupud

  • .praegune kataloog
  • ..ülemkataloog
  • ~kodukataloog
  • ls -aka peidetud
  • ls -Apeidetud ilma . ja .. kirjeteta
  • ls -ladetailne vaade
  • "fail nimi.txt"nimi tühikuga
  • rm -rrekursiivne kustutus

Teksti vaatamine ja liikumine

Faili vaatamine ei muuda selle sisu. Vali tööriist selle järgi, kui palju teksti korraga vajad:

KäskToiming ja nähtav tulemus
cat fail.txtkuva kogu fail terminali; sobib lühikese teksti jaoks
less fail.txtava lehitsetav ja otsitav vaade; välju q-ga
head -n 7 fail.txtkuva esimesed seitse rida
tail -n 7 fail.txtkuva viimased seitse rida

-n määrab ridade arvu. Ilma selle valikuta näitavad head ja tail kümmet rida. Lühikesest failist ei saa rohkem ridu kui seal on.

Võrdle algust ja lõppu

Linuxis ja macOS-is on /etc/hosts tavaliselt olemasolev tekstifail. Selle muutmise asemel vaatame seda:


cat /etc/hosts
head -n 3 /etc/hosts
tail -n 3 /etc/hosts

Võrdle väljavõtteid tervikuga. Faili sisu on masinati erinev; praegu ei pea sa võrguaadressidest aru saama. Kui fail puudub, vali mõni olemasolev tekstifail oma kataloogist. Piltide ja muude binaarfailide jaoks need vaatamiskäsud ei sobi.

Pikka faili sirvi less-iga

cat saadab pika faili korraga terminali kerimisajalukku. less laseb valida, millist kohta parajasti näed. Näiteks Linuxi ja macOS-i teenusenimede loend on tavaliselt piisavalt pikk:


less /etc/services

Kui seda faili pole, ava mõni teine pikk tekstifail. Järgmised klahvid sisestatakse less-i sees, mitte shelli viiba järel:

KlahvToiming
tühik / blehekülg edasi / tagasi
/ssh ja Enterotsi tekstist ssh
n / Njärgmine / eelmine otsinguvaste
g / Gfaili algus / lõpp
78gmine reale 78
25%liigu umbes veerandi kaugusele failis
qvälju tagasi shelli

Mitut faili saab avada kujul less esimene.txt teine.txt. Siis viivad :n ja :p järgmise ning eelmise faili juurde; tavaline n liigub endiselt otsinguvastete vahel. v avab praeguse faili redaktoris, sageli vi või vim: sellest alates võid faili ka muuta. Redaktorist väljumist õpetab järgmine peatükk.

Faili lõpp ja kasvav logi

tail -n 20 app.log näitab lõpu kakskümmend rida ja lõpetab. tail -f app.log näitab lõppu ning jääb juurde tulevaid ridu ootama. See ei ole kinnijäämine; katkesta jälgimine Ctrl-c-ga. Oma kahe terminaliga katse tuleb logide peatükis.

Minitest

  1. Vali tekstifail ja näita ainult selle esimest rida. Millist valikut vajad?
  2. Otsi less-is mõnda korduvat sõna ning liigu järgmise ja eelmise vaste juurde.
  3. Mille poolest erinevad n ja :n? Millal kumbki kasulik on?
  4. Miks tail -f tavaliselt ise ei lõpeta, aga tail -n 20 lõpetab?

Peatüki täisspikker

Algaja

Eesmärk

Vali faili pikkuse ja küsimuse järgi: kogu sisu, lehitsemine, algus või lõpp.

Käsud ja näited

  • cat /etc/hostskuva lühikese faili sisu
  • less /etc/serviceslehitse pikemat faili
  • head -n 7 fail.txtnäita esimesed seitse rida
  • tail -n 7 fail.txtnäita viimased seitse rida
  • tail -f app.logoota lisanduvaid ridu; lõpeta Ctrl-c-ga
  • less a.txt b.txtava mitu nimetatud faili

Märgid ja valikud

  • qless: välju
  • /tekstless: otsi edasi
  • n / Nless: järgmine / eelmine vaste
  • 78g / 25%less: rida 78 / veerandi peale
  • g / Gless: algusse / lõppu
  • vless: ava määratud redaktor; pärast väljumist naased
  • :n / :pless: järgmine / eelmine fail

Failide muutmine: nano ja esimene kokkupuude vim-iga

less-iga vaatasid faili; tekstiredaktoriga muudad seda. Alguseks sobib nano, mille klahvijuhis on akna allservas. vi ja vim on klassikalised tekstiredaktorid, kus sisestamine ja käskude andmine toimuvad eri režiimides.

Loo ja muuda fail nano-ga

Tööta oma harjutuskataloogis. nano naide.txt avab olemasoleva faili või uue tühja dokumendi. Kettal muutub fail alles salvestamisel.


nano naide.txt

Kirjuta redaktorisse kolm rida:


esimene
teine
kolmas

Salvesta Ctrl-o, kinnita nimi Enter-iga ja välju Ctrl-x-iga. Allserva märge ^O tähendabki Ctrl-o, mitte kahte sisestatavat märki.

Kontrolli tulemust shellis:


cat naide.txt

Ava fail uuesti, muuda teisel real üks sõna ja salvesta. Ctrl-w alustab nano-s tekstiotsingut. Kui väljud salvestamata muudatustega, küsib redaktor, kas soovid need salvestada; loe küsimust, mitte ära vajuta kinnitust harjumusest.

Kui avaneb vi või vim

Need redaktorid võivad avaneda ka mõne teise tööriista, näiteks Giti kaudu. Väljumiseks ei pea kogu redaktorit ära õppima:

Klahv või käskToiming
Escnaase tavarežiimi
ialusta teksti sisestamist kursori kohale
:w ja Entersalvesta fail
:q ja Entervälju, kui salvestamata muudatusi pole
:q! ja Enterhülga salvestamata muudatused ja välju
:wq ja Entersalvesta ning välju

Kooloniga käsu eel vajuta Esc. :q! ei taasta varasema salvestamise eelset faili, vaid loobub ainult veel salvestamata muudatustest.

Kui nano puudub

command -v nano näitab, kust shell käsu leiaks; tühi väljund tähendab, et seda nime ei leitud. Kasuta olemasolevat tekstiredaktorit või paigalda nano oma süsteemi paketihalduriga. Ära ava tundmatut süsteemifaili lihtsalt katsetamiseks.

Minitest

  1. Lisa failile naide.txt neljas rida ja kontrolli salvestatud tulemust cat-iga.
  2. Ava sama fail uuesti, muuda teksti ja välju seekord salvestamata. Kas fail kettal muutus?
  3. Kui vi või vim on olemas, ava sellega naide.txt ja välju muudatusi tegemata.

Peatüki täisspikker

Algaja

Eesmärk

less-iga vaatasid faili; tekstiredaktoriga muudad seda. Alguseks sobib nano, mille klahvijuhis on akna allservas. vi ja vim on klassikalised tekstiredaktorid, kus sisestamine ja käskude…

Põhikujud

  • less fail.txtvaata faili sisu mugavalt
  • nano fail.txtlihtne tekstiredaktor
  • vim fail.txtklassikaline redaktor
  • vi fail.txtsama pere variant
  • command -v nanokontrolli olemasolu

`vi`/`vim` minispikker

  • Escvälju sisestusest
  • :qvälju
  • :q!välju salvestamata
  • :wqsalvesta ja välju

Käskude kuju ja argumentide loogika

Uut käsku on lihtsam lugeda, kui eristad toimingut, selle valikuid ja sisendit.

Alusta ühest näitest


ls -la /etc
OsaTähendus
lskäsk: loetle kataloogi sisu
-lvalik: näita detailset loendit
-avalik: kaasa ka peidetud kirjed
/etcargument: millist kataloogi vaadata

-la ühendab siin valikud -l ja -a. Üldine märkimisviis on käsk [valikud] [argumendid]: käsiraamatu nurksulud tähistavad valikulist osa, mitte käsureale kirjutatavaid sulge. Tehnilises dokumentatsioonis võidakse argumentideks nimetada ka valikuid.

Lühikesed ja pikad valikud

Lühike valik algab ühe kriipsuga, pikk valik enamasti kahega. Näiteks GNU ls -a ja ls --all on sama tähendusega, kuid macOS-i ls pikka kuju --all ei toeta.

Mõni valik vajab väärtust. Näites head -n 5 fail.txt kuulub 5 valiku -n juurde, mitte ei ole teine failinimi. Ära ühenda väärtusega valikuid juhuslikult üheks lipureaks.

Lipul ei ole kõigi käskude jaoks sama tähendust: ls -h näitab suurusi ühikutega, teises programmis võib -h tähendada abi. Kontrolli man-ist oma käsu valikuid.

Argumentide roll ja järjekord

cp vana.txt uus.txt kopeerib allika vana.txt sihtfailiks uus.txt. Nende vahetamine muudab kopeerimise suunda. Sihtfaili olemasolev sisu võib üle kirjutatud saada.

Kõige ülekantavam harjumus on panna valikud failinimede ette, näiteks ls -l /etc. Kõik programmid ei luba valikuid suvalisse kohta paigutada.

Tühikud, jutumärgid ja paomärk

Shell eraldab sõnu tühikute järgi. Tühikuga nimi tuleb koos hoida:


touch "minu fail.txt"
ls -l "minu fail.txt"

Sama nime saab kirjutada ka minu\ fail.txt: kurakriips \ võtab järgnevalt tühikult eraldaja tähenduse.

KujuShelli käitumine
"minu fail.txt"üks argument; tühik jääb nime sisse
"$HOME"üks argument; muutuja asendatakse väärtusega
'$HOME'täht-tähelt tekst $HOME, mitte muutuja väärtus

HOME on kodukataloogi sisaldav muutuja. Võrdle:


echo "$HOME"
echo '$HOME'

Esimene näitab koduteed, teine sõna $HOME. Üksikjutumärgid kaitsevad teksti shelli tõlgenduse eest; käivitatav programm võib oma argumenti ikka eraldi tõlgendada, näiteks printf reavahetusmärki \n.

Kriipsuga algav failinimi

Paljudes käskudes lõpetab eraldi -- valikute lugemise. Seejärel käsitletakse ka kriipsuga algavat nime argumendina:


touch -- -markmed.txt
ls -l -- -markmed.txt

Siin -- ise ei ole pikk valik; pikk valik oleks näiteks --help. Alternatiiv on nimi ./-markmed.txt, mis algab punktiga, mitte kriipsuga.

Failinimede mustrid

Mustrilaiendus (*globbing*) on shelli käitumine, mitte uus käsk. Shell asendab mustri sobivate nimedega enne programmi käivitamist.

MusterSobivad nimed
*.txtnimed, mis lõpevad .txt-ga
words.0?.txtwords.0 järel täpselt üks märk, siis .txt
words.0[0-9].txtkeskel üks number 0–9: 00 kuni 09

Katseta oma harjutuskataloogis:


touch words.00.txt words.01.txt words.0a.txt
ls words.0?.txt
ls words.0[0-9].txt

Esimene muster leiab kõik kolm, teine ainult kaks numbrilist nime. ? ei tähenda „üks number“, vaid „üks märk“.

Muster võib sobitada ka katalooginime. ls võib siis loetleda selle kataloogi sisu; ainult sobitatud kirjete endi vaatamiseks kasuta ls -d *.txt. -d käsitleb kataloogi kirjena.

Jutumärgid, näiteks '*.txt', takistavad shelli mustrilaiendust. Peidetud nimed ei sobi tavaliselt algava * alla. Kui vaste puudub, annab zsh vaikimisi vea no matches found, Bash jätab mustri tavaliselt sõnasõnaliselt käsule; seadistus võib seda muuta.

Minitest

  1. Milline osa käsus head -n 5 "minu fail.txt" on käsu nimi, valik, valiku väärtus ja failinimi?
  2. Mis vahe on "$HOME" ja '$HOME'?
  3. Miks leiab words.0?.txt ka nime words.0a.txt?
  4. Kuidas vaadata kriipsuga algava faili õigusi nii, et nimi ei muutuks valikuks?

Peatüki täisspikker

Algaja

Eesmärk

Õpi ühe näite pealt eristama käsku, lippu ja argumenti; siis ei tundu uus käsk iga kord täiesti uus keel.

Üks näide

  • ls -la /etcterve kuju
  • lskäsk
  • -lalipud
  • /etcargument
  • cp vana.txt uus.txtkaks argumenti

Olulised märgid

  • -lühike lipp
  • --üksinda lõpetab valikute loendi
  • "..."hoia koos; muutujad toimivad
  • '...'täht-tähelt nagu kirjas
  • *failimuster
  • ?üks märk

Tüüpilised kujud

  • head -n 3 fail.txtvalik -n vajab arvväärtust
  • cp 'fail nimi.txt' koopia.txtnimi tühikuga
  • touch -- -algab-kriipsuga.txtära tõlgenda lipuna
  • ls *.txtkõik .txt lõpuga failid
  • ls words.0?.txt0 järel üks märk, mitte tingimata number

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

Esimene tervikharjutus: 30 minutit

Oled õppinud terminalis liikuma, faile vaatama ja muutma ning väljundit suunama. Nüüd tee neist oskustest üks töövoog: loo väike sõnaloend, kopeeri see ja muuda koopiat originaali puutumata.

1. Vali töökoht

mkdir -p loob kogu puuduva tee, ka kataloogi tmp, kui seda veel pole. Kui oled sama katset juba teinud, vali tervikharjutus asemel uus nimi, et mitte vanu faile üle kirjutada.


mkdir -p ~/tmp/tervikharjutus
cd ~/tmp/tervikharjutus
pwd
ls

Kontroll: tee lõpeb /tmp/tervikharjutus ja uue kataloogi loend on tühi.

2. Kirjuta ja kontrolli

Esimene rida loob faili; järgmised lisatakse lõppu. Ennusta enne viimast käsku ridade arvu.


echo tere > sonad.txt
echo maailm >> sonad.txt
echo linux >> sonad.txt
cat sonad.txt
wc -l sonad.txt

Näed kolme sõna eraldi ridadel ning seejärel ridade arvu 3. Kui tulemus erineb, peatu: korduv >> lisab ridu juurde, aga > kirjutab vana sisu üle.

3. Muuda ainult koopiat


cp sonad.txt koopia.txt
echo terminal >> koopia.txt
wc -l sonad.txt koopia.txt

Originaalis peab olema kolm ja koopias neli rida. Viimane kokkuvõtterida näitab kahe faili peale seitset rida. Vaata mõlemat cat-iga, kui arvud ei klapi.

Iseseisev ülesanne

  1. Lisa koopiale nano abil viies rida ja salvesta.
  2. Näita koopiast ainult viimased kaks rida.
  3. Nimeta koopia ümber nimeks minu sonad.txt. Miks on käsus jutumärke vaja?
  4. Kontrolli, et algne sonad.txt sisaldab endiselt kolme rida.
  5. Selgita, mis muutuks, kui kasutaksid lisamisel >> asemel >.

Kui mõne käsu tähendus on ebaselge, vaata abi leidmist või suunamist. Kui saad harjutuse tehtud, jätka operatsioonisüsteemide ja shellide ülevaatest, seejärel liigu failisüsteemi kaardi juurde.

Peatüki täisspikker

Algaja

Eesmärk

kontrolli alguskohta; tööta eraldi harjutuskataloogis; lisa faili read väikeste sammudena

Olulised märgid

  • >kirjuta üle
  • >>lisa faili lõppu juurde
  • Ctrl-ckatkesta programmi töö
  • manvaata abi

Lühike töövoog

  • pwd && lskontrolli alguskohta
  • mkdir proov && cd proovloo töökataloog
  • echo tere > sonad.txttee esimene rida
  • echo maailm >> sonad.txtlisa järgmine rida
  • cat sonad.txt && wc -l sonad.txtkontrolli tulemust
  • cp sonad.txt koopia.txttee koopia

Linux, Unix, GNU, macOS, Windows ja shellid

Linuxi kasutamisel kohtab kiiresti mitut sarnast sõna: Linux, Unix, GNU, macOS, Windows, shell, sh, bash, zsh, PowerShell, WSL. Need ei tähenda päris sama asja.

Kiirülevaade

Eesmärk on saada mõisteline kaart: mis tuleb süsteemist, mis shellist ja mis konkreetsetest käsureatööriistadest.

Mõiste või käskMilleksMida tavaliselt näed
Linuxtuum, mitte kogu süsteemsüsteemiinfo uname väljundis
GNUpaljud tuttavad käsureatööriistadkäsud ja nende GNU-spetsiifilised lipud
shellloeb ja tõlgendab käsuridaviip, muutujad ja shelli sisekäsud
macOS, Windowssarnane pind, eri tööriistadsama käsk võib käituda erinevalt
uname -akontrolli süsteemi ja kernelitüks pikk süsteemirida
echo "$SHELL"näita vaikimisi shellitee nagu /bin/zsh
ps -p $$näita käimasolevat shellishelliprotsessi rida

Tüüpilised algaja vead

  • arvatakse, et Linux, Unix ja GNU tähendavad sama asja
  • aetakse segi terminal, shell ja operatsioonisüsteem
  • eeldatakse, et macOS-i või Windowsi käsk käitub täpselt nagu Linuxis

Võrdle oma keskkonda

Unix-laadses shellis võrdle uname -a süsteemiinfot, echo "$SHELL" seadistatud sisselogimisshelli ja ps -p $ tegelikult töötavat shelliprotsessi. $SHELL ei pruugi uue shelli käivitamisel muutuda.

Vajaduse järgi kasuta üht lisakontrolli:

KeskkondKäskTulemus
paigaldatud Bash või zshbash --version või zsh --versionvalitud shelli versioon
macOSsw_versoperatsioonisüsteemi versioon
Windowsi PowerShellwsl -l -vpaigaldatud WSL-jaotused ja WSL-i põlvkond

Levinud shellid

  • sh on ajalooline ja üldine shelliliides
  • bash on väga levinud GNU shell
  • zsh on paindlik interaktiivne shell, mida kasutatakse palju ka macOS-is
  • PowerShell on Windowsi käsukeskkond ja skriptikeel

Linux, Unix ja GNU erinevused

Praktikas öeldakse sageli "Linux", kuigi tegelik süsteem koosneb mitmest kihist:

  • Linux annab kerneli
  • GNU annab suure hulga käsureatööriistu
  • distributsioon seob need tervikuks

Samas macOS on Unix-laadne, kuid paljud käsud ei ole seal GNU variandid. Näiteks sed, grep, find ja tar võivad käituda veidi teisiti kui Linuxis. Windows ei ole Unix-laadne, kuid WSL annab päris Linuxi kasutajaruumi, nii et enamik selle õpiku näiteid töötab seal otse.

macOS: miks see on sarnane

macOS tundub käsureal Linuxi moodi, sest:

  • tal on Unix-laadne kasutajakeskkond
  • seal on olemas sh, bash, zsh, ssh, grep, sed, awk
  • failisüsteem, õigused ja torude loogika on tuttavad
  • väga suur osa shelli- ja SSH-töövoogudest on sama

See on põhjus, miks suur osa siinsetest käsureatöövoogudest töötab macOS-is väikeste kohandustega.

macOS: mis on teisiti

macOS ei ole tavaliselt "GNU/Linux". Praktikas tähendab see:

  • paketihaldur ei ole apt või dnf; kõige levinum lisapakettide tööriist on Homebrew ehk brew
  • mitmed käsud on BSD variandid, mitte GNU variandid
  • mõni lipp või vaikekäitumine erineb
  • teenuste haldus ei käi systemd kaudu

Mõni Linuxi käsk puudub macOS-is ka täiesti sama nime all. Näiteks:

  • Linuxis kasutatakse tihti ip a
  • macOS-is on tavalisem ifconfig
  • Linuxis kasutatakse tihti ss -ltn
  • macOS-is on tavalisem lsof -iTCP -sTCP:LISTEN -n -P või netstat -anv -p tcp | grep LISTEN

Kõige sagedasem praktiline erinevus on see, et Linuxi juhendis toodud lipp ei pruugi macOS-is sama moodi töötada.

Kuidas saada macOS võimalikult sarnaseks Linuxiga

Algaja jaoks ei ole tavaliselt vaja macOS-i vägisi Linuxi moodi ümber ehitada.

Enamasti piisab sellest:

  1. kasuta olemasolevat zsh-i või bash-i
  2. õpi selgeks põhilised käsud ja nende loogika
  3. paigalda Homebrew ainult siis, kui sul on päriselt vaja lisatarkvara

Kui tahad kasutada mõne Linuxi tööriistaga samanimelist käsku, tee seda vajaduse korral, mitte „igaks juhuks“. Näiteks võrgukäskude puhul võib hiljem abiks olla brew install iproute2mac, kuid alguses ei ole seda vaja.

Windows: milline tee valida

Windowsis on kolm peamist teed:

  • WSL2: parim valik, kui tahad selle õpiku käske kasutada võimalikult päris Linuxi moodi
  • PowerShell: parim valik Windowsi enda halduseks
  • Git Bash: kerge ja mugav, aga mitte täielik Linux

Kui soovid, et õpiku näited töötaksid Windowsis Linuxiga võimalikult sarnaselt, kasuta WSL2.

WSL tähendab Windows Subsystem for Linux. See on Windowsi võimalus käivitada päris Linuxi kasutajaruumi omaette keskkonnas. Praktikas tähendab see, et saad Windowsi sees avada Ubuntu või muu Linuxi keskkonna ja kasutada seal tavapäraseid Linuxi käske, pakette ja shelli.

WSL2 on uuem ja tavalisem variant. Õpiku mõttes on ta hea sellepärast, et käsud käituvad seal palju rohkem päris Linuxi moodi kui PowerShellis või vanas cmd.exe-s.

Kuidas saada Windows võimalikult sarnaseks Linuxiga

Kõige mõistlikum töövoog on:

  1. paigalda Windows Terminal
  2. paigalda WSL2
  3. vali näiteks Ubuntu
  4. tee käsureatöö WSL-i sees, mitte tavalises cmd.exe-s

Alustuseks piisab sageli sellest:


wsl --install

Pärast paigaldust kontrolli:


wsl -l -v

Ja siis mine Linuxi sisse:


wsl

Seal sees hakkavad juba tööle tavapärased Linuxi käsud:


uname -a
echo "$SHELL"
sudo apt update

Kuidas Windowsis shelliga mõelda

Kui töötad WSL-is, siis loogika on:

  • Windows on hostsüsteem
  • WSL annab Linuxi kasutajaruumi
  • shell, paketid ja käsud töötavad Linuxi loogika järgi

Kui töötad PowerShellis, siis loogika on teine:

  • toru ei kanna ainult teksti, vaid objekte
  • käsunimed ja lühendid on teised
  • paljud selle õpiku näited ei ole üks ühele kopeeritavad

See tähendab, et "sama moodi toimima" saad Windowsis kõige paremini WSL-i abil, mitte PowerShelli Linuxiks painutades.

Praktilised soovitused Windowsi jaoks

  • hoia Linuxi projektid võimalusel WSL-i kodukataloogis nagu ~/projekt, mitte alati /mnt/c/...
  • kasuta Windows Terminali, mitte vana konsooli
  • kasuta VS Code Remote WSL töövoogu, kui arendad Windowsist Linuxi tööriistadega
  • kasuta PowerShelli siis, kui haldad Windowsi ennast

Mis jääb Windowsis ikkagi teistsuguseks

  • failiteed ja kettatähed on teistsugused
  • CRLF ja LF võivad tekitada segadust
  • .exe, .bat ja Windowsi õiguste loogika ei ole sama mis Unixis
  • mõni tööriist töötab WSL-is paremini kui otse Windowsi failisüsteemis

Minitest

  1. Uuri välja, millist shelli sa kasutad.
  2. Võrdle käske echo $SHELL ja ps -p $$.
  3. Kontrolli, kas sinu süsteemis on olemas bash, zsh ja sh.
  4. Kui oled macOS-is, kontrolli käsuga sw_vers, millist süsteemi kasutad.
  5. Kui oled Windowsis, kontrolli käsuga wsl -l -v, kas WSL on olemas.
  6. Kirjelda ühe lausega, miks WSL2 sobib Linuxi-laadse käsureatöö jaoks paremini kui ainult PowerShell.

Lisalugemine

Selle teema usaldusväärsemad viited leiad lisast Lisa E: usaldusväärsed viited ja lisalugemine ning shelli enda kohta jaotisest Shellid ja põhikäsud.

Peatüki täisspikker

Baas ja süsteemipilt

Eesmärk

erista süsteemi, shelli ja käsureatööriistu; sama terminaliaken ei tähenda veel, et Linux, macOS ja Windows käituksid ühtemoodi

Kontrollkäsud

  • uname -asüsteemi ja kerneli rida
  • echo "$SHELL"seadistatud sisselogimisshell
  • ps -p $$praegu töötav shelliprotsess
  • command -v lskust käsk leitakse
  • sw_versmacOS-i versioon
  • wsl -l -vWSL-i jaotused

Olulised mõisted

  • Linuxkernel ehk tuum
  • GNUpaljud põhikäsud
  • shelltõlgendab käske
  • WSLLinux Windowsis
  • BSDmacOS-i tööriistapere
  • PowerShellWindowsi käsukeskkond

Failisüsteemi kaart

Loogika

Algaja jaoks on väga tavaline küsimus:

  • mis vahe on / ja ~ vahel
  • miks mõni fail on minu kodukataloogis, aga mõni /etc all
  • miks süsteemifailidega ei tasu suvaliselt katsetada

Failisüsteemi kaart aitab siduda üksikuid käske suurema pildiga. Kui tead, millist tüüpi faile eri kataloogides tavaliselt leidub, on ka veaotsing ja navigeerimine palju lihtsam.

Kiirülevaade

Eesmärk on luua süsteemist ülevaade, et teaksid, kus on ohutu töötada ja millised kataloogid kuuluvad süsteemile.

Tee või käskMilleksMida tavaliselt näed
/kogu failipuu juursüsteemi ülemine tase
~sinu kodukataloogsinu failide töökoht
/bin, /usr/binkäivitatavad programmidkäsud nagu ls, cat, grep
/etcseadistusedpalju süsteemifaile
/varmuutuv sisu, näiteks logidlogid, vaheandmed ja teenuste failid
/tmpajutised failidajutine tööala
pwdnäita praegust asukohtaüks täistee
echo "$HOME"näita kodukataloogitee sinu kodukataloogi

Tüüpilised algaja vead

  • arvatakse, et ~ ja / on lihtsalt kaks erinevat märki sama asja jaoks
  • minnakse süsteemikaustadesse midagi muutma enne, kui saadakse aru, mis seal elab
  • eeldatakse, et Linux ja macOS kasutavad täpselt samu teid

Käivita need käsud


pwd
echo "$HOME"
cd /
ls
ls /etc | head
ls /usr | head
ls /var | head
ls -ld /tmp

Kui kasutad macOS-i, siis vaata ka:


ls /Users

/ ehk juur

Kõige ülemine kaust on /.

See ei tähenda „minu kodukataloog“, vaid kogu failipuu algust. Kui kirjutad:


cd /

siis liigud juurkataloogi, mitte oma isiklikku töökataloogi.

Oluline vahe:

  • cd / viib juurkataloogi
  • cd ~ viib sinu kodukataloogi
  • cd .. liigub ühe taseme võrra üles

Kodukataloog: ~

Kodukataloog on koht, kus tavaline kasutaja enamasti töötab.

Linuxis on see sageli midagi sellist:


/home/kasutaja

macOS-is sageli midagi sellist:


/Users/kasutaja

Sümbol ~ tähendab lühidalt sinu kodukataloogi. Näiteks:

  • ~/Downloads
  • ~/.ssh
  • ~/proov

See on põhjus, miks esimesed harjutused tasub teha just kodukataloogi all.

/etc

/etc sisaldab palju süsteemi seadistusi.

Sealt võib leida näiteks:

  • teenuste seadistusfaile
  • võrgu seadeid
  • kasutajate ja gruppide infot

See ei ole hea koht algajale juhuslikeks katsetusteks. Selles kaustas muudatusi tehes tasub alati täpselt teada, mida muudad ja miks.

/usr

/usr sisaldab palju programme, käske, teeke ja dokumentatsiooni.

Praktiliselt võid sellest mõelda nii:

  • siin on palju süsteemi tööriistu
  • sina kasutad neid sageli, aga ei muuda neid otse käsitsi

Sageli näed seal kaustu nagu:

  • /usr/bin
  • /usr/lib
  • /usr/share

Nimi bin tuleb ajalooliselt sõnast binary. Unix-laadsetes süsteemides tähendab see tavaliselt kataloogi, kus on käivitatavad programmid ehk käsud. Näiteks:

  • /bin sisaldab süsteemi põhilisi käske
  • /usr/bin sisaldab suurt hulka tavakasutaja käske
  • ~/bin on levinud koht kasutaja enda väikeste skriptide jaoks

Kõik bin-kataloogis olev ei pea tänapäeval olema masinkoodis binaar. Seal võib olla ka shelliskripte või Pythoni programme, kui neid saab käsuna käivitada.

/var

/var on mõeldud muutuvate andmete jaoks.

Seal võivad olla näiteks:

  • logifailid
  • vahemälud
  • spool-id
  • teenuste töö käigus tekkivad andmed

Kui otsid, miks mingi teenus ei tööta või kuhu ruum kadus, jõuad üsna tihti just /var alla.

/tmp

/tmp on ajutiste failide koht.

See tähendab tavaliselt:

  • siia pannakse lühiajaliselt vahefaile
  • süsteem või programmid võivad selle sisu hiljem kustutada
  • siia ei tasu panna faile, mida tahad kindlasti alles hoida

Kui tahad lihtsalt kiiresti midagi testida, võib /tmp olla kasulik töökoht. Kui tahad, et fail kindlasti alles jääks, kasuta pigem oma kodukataloogi.

Linux ja macOS ei ole siin täiesti samad

Raamatu loogika on Unix-laadne, aga detailides on vahe:

  • Linuxis on kasutajate kodud tihti /home
  • macOS-is on kasutajate kodud tihti /Users
  • macOS-is on osa süsteemikaustu kaitstumad ja neid ei ole mõistlik käsitsi muuta

Seetõttu tasub mõelda nii teele endale kui ka selle rollile.

Minitest

  1. Seleta oma sõnadega, mis vahe on cd / ja cd ~ vahel.
  2. Uuri välja, mis on sinu kodukataloogi tegelik tee.
  3. Vaata, kas sinu süsteemis on kasutajate kodud pigem /home või /Users all.
  4. Pane kirja, milline kaust sobib ajutisteks failideks ja milline süsteemi seadistusteks.

Peatüki täisspikker

Baas ja süsteemipilt

Eesmärk

õpi eristama süsteemi juurt, oma kodukataloogi ning ajutisi ja süsteemseid katalooge; siis on lihtsam aru saada, kus tohid rahulikult katsetada

Põhikujud

  • pwdkontrolli asukohta
  • echo "$HOME"vaata oma kodu
  • cd /mine juurkataloogi
  • cd ~mine kodukataloogi
  • ls /etc | headpiilu seadistusi
  • ls -ld /tmpvaata ajutist kataloogi

Olulised teed

  • /kogu failipuu juur
  • ~sinu kodukataloog
  • /etcsüsteemi seadistused
  • /varlogid ja muutuv sisu
  • /tmpajutiste failide koht
  • /Users / /homekasutajate kodud

Kettaruum ja süsteemi maht

df näitab failisüsteemi vaba ruumi; du mõõdab failide ja kataloogide kasutatud ruumi. Nendega saad eristada küsimusi „kas ketas on täis?“ ja „mis siin ruumi võtab?“.

Alusta üldpildist

KäskMida näed
df -h .praegust kataloogi sisaldava failisüsteemi kogu-, kasutatud ja vaba maht
df -hmitme failisüsteemi tabel koos haakepunktidega
du -sh .praeguse kataloogi ja selle sisu kogumaht

-h kuvab suurused ühikutega, näiteks K, M ja G. du -s annab ühe kokkuvõtterea, mitte kogu alamkataloogide loendi. Suure puu mõõtmine võib võtta aega.

Leia suurimad kirjed

du -a loetleb lisaks kataloogidele failid. -k seab kõigi suuruste ühikuks 1024 baiti, et Linuxi ja macOS-i tulemusi saaks samal alusel lugeda. sort -n sordib arvuliselt, -r pöörab järjestuse kahanevaks.


du -ak . | sort -nr | less

Üleval on suurimad kirjed; less-is saad otsida ja q-ga väljuda. Kataloogi rida sisaldab juba alamkataloogide mahtu: ära liida kogu loendi ridu kokku, muidu loendad sama sisu mitu korda.

Näiteks kui ülemiste ridade seas on mahukas ./projekt/.git, mõõda järgmiseks projekti, mitte kogu ketast. Peidetud kataloogid kaasatakse automaatselt, sest lähtekohaks on ., mitte shelli muster *.

Lühem loend ja ühikutega sort

Linuxi ja macOS-i du -d 1 piirab kuvatava kataloogisügavuse ühe tasemega; mõõtmiseks loetakse siiski kogu sisu:


du -k -d 1 . | sort -nr

See annab alamkataloogide mahud ja kogusumma, mitte eraldi iga tavalise faili rida. Kui sinu du ei toeta -d, kasuta eelmist du -ak varianti.

Inimloetava pika loendi jaoks sobib:


du -ah . | sort -hr | less

sort -h arvestab suurusliiteid; ilma -r-ita tuleb väiksem liide enne suuremat. See sobib ühe du -h käivituse väljundile. Suvalisi ühikutega arve ei teisenda see täpseks baidisummaks: näiteks 12345K järjestub enne 1M, sest liidet võrreldakse enne arvu. Täpsemaks ühtseks võrdluseks eelista du -k | sort -n. Kõik vanemad sort-i variandid ei toeta -h.

Kui mõõtmine ei klapi

  • Permission denied: osa puust jäi lugemata. Veateate peitmine kujul 2>/dev/null ei tee mõõtmist täielikuks.
  • df ja du erinevad: esimene mõõdab tervet failisüsteemi, teine valitud puus nähtavat sisu. Erinevust võivad tekitada ka hetktõmmised, jagatud kettaplokid või kustutatud fail, mida protsess veel avatuna hoiab.
  • ls -l ja du erinevad: faili loogiline pikkus ei pea võrduma talle eraldatud kettaruumiga, näiteks hõredas failis.
  • Mõõtmine on aeglane: alusta konkreetsest projektist või allalaadimiste kataloogist. Kogu / läbimine pole tavaliselt esimene vajalik samm.

Suur fail ei ole automaatselt tarbetu. Tuvasta sisu ja selle kasutaja enne kustutamist; ruumimõõtmine ise midagi ei eemalda.

Minitest

  1. Kui palju on vaba ruumi failisüsteemis, kus praegu töötad?
  2. Leia ühe projekti suurim alamkataloog. Kas see on nähtav ka tavalise ls-iga?
  3. Miks on du loendi kogusumma liitmine eksitav?
  4. Mille poolest erinevad sort -n ja sort -h? Proovi arve 9 ja 100, seejärel 900K ja 1M.

Peatüki täisspikker

Baas ja süsteemipilt

Eesmärk

df näitab failisüsteemi vaba ruumi, du loendab valitud failide ja kataloogide kettakasutust.

Käsud ja näited

  • df -h .selle failisüsteemi kasutatud ja vaba maht
  • du -sh .praeguse kataloogipuu kogumaht
  • du -h -d 1 .esimese taseme mahud, ka peidetud kataloogid
  • du -h -d 1 . | sort -hsordi ühikusufiksiga mahud kasvavalt
  • du -ak . | sort -nr | lesskõik kirjed 1024-baidistes ühikutes, suurimad ees

Märgid ja valikud

  • du -sainult kogusumma
  • du -aka üksikfailide mahud
  • du -kühtlane 1024-baidine ühik
  • sort -harvestab ühikusufiksi järku, siis arvväärtust
  • sort -nrarvuliselt kahanev järjestus

Õigused, omanikud ja täitmisbitid

Loogika

Õigused määravad, kes võib faili lugeda, muuta või käivitada. See on seotud kasutajate, gruppide, sudo ja shelliskriptidega, sest kõik need teemad eeldavad õiguste õiget mõistmist.

Kiirülevaade

Eesmärk on lugeda õiguste rida, teha fail vajadusel käivitatavaks ja mõista veateadet Permission denied.

Käsk või mõisteMilleksMida tavaliselt näed
ls -lnäita õigusi, omanikku ja gruppirida nagu -rw-r--r--
chmodmuuda õigusiedukal juhul sageli vaikne
chownmuuda omanikku või gruppiedukal juhul sageli vaikne
täitmisbitt xluba faili käivitadafaili saab programmina käivitada
kataloogi xluba kataloogi „siseneda“nimed ja teed muutuvad kasutatavaks

drwxr-xr-x algab d tähega, sest tegu on kataloogiga.

Tüüpilised algaja vead

  • arvatakse, et chmod +x teeb failist automaatselt „programmi“
  • muudetakse õigused liiga laiaks, ilma et oleks aru saadud, kellele mida antakse
  • aetakse segi faili lugemisõigus ja käivitamisõigus

Õiguste vaatamine


ls -l

Näites:


-rw-r--r-- 1 mari users 120 Apr 12 10:00 naide.txt

See rida kirjeldab:

  • faili tüüpi
  • omaniku õigusi
  • grupi õigusi
  • teiste kasutajate õigusi

Lühidalt:

  • r tähendab lugemist
  • w tähendab kirjutamist
  • x tähendab faili puhul käivitamist, kataloogi puhul sisenemist

Miks kataloogi x-õigus on eriline

Faili puhul tähendab x, et faili võib programmina käivitada.

Kataloogi puhul tähendab x midagi natuke muud:

  • tohid sinna cd abil siseneda
  • tohid kasutada selle sees olevaid nimesid
  • ilma x-õiguseta võib kataloog olemas olla, aga sa ei saa selles normaalselt liikuda

Kataloogi r lubab nimede loendit lugeda, w kirjeid luua või eemaldada ning x teadaolevaid nimesid kasutada. Faili kustutamine sõltub tavaliselt vanemkataloogi w- ja x-õigusest, mitte faili enda kirjutamisõigusest; lisareeglid, näiteks sticky-bit ja ACL, võivad seda piirata.

Õiguste muutmine


chmod u+x skript.sh
chmod 644 naide.txt

Siin on kaks levinud stiili:

  • sümboolne kuju nagu chmod u+x fail
  • numbriline kuju nagu chmod 644 fail

Sümboolne kuju sobib hästi siis, kui tahad teha ühe väikese muudatuse:

  • u+x fail lisa omanikule täitmisõigus
  • g-w fail võta grupilt kirjutamisõigus ära

Numbriline kuju sobib siis, kui tahad seada terve õiguste rea korraga:

  • 644 annab omanikule lugemise ja kirjutamise, grupile ning teistele ainult lugemise
  • 755 annab omanikule kõik kolm õigust, grupile ning teistele lugemise ja täitmise

Numbrid on summad: r = 4, w = 2, x = 1. Näiteks 6 = 4 + 2. Need määravad õigused, mitte faili tüübi.

Omaniku muutmine


sudo chown kasutaja:grupp fail.txt

Käivitatavaks tegemine

chmod +x ja shebang-rida käivad sageli koos.

  • shebang nagu #!/bin/sh või #!/usr/bin/env python3 ütleb, millise tõlgendajaga faili käivitada
  • täitmisõigus ütleb, et faili tohib käivitada käsuga ./fail
  • kui käivitad faili kujul ./fail, siis süsteem vaatab kõigepealt faili algust ja otsib sealt, millega seda tõlgendada

Kui üks neist puudub, siis võib fail küll olemas olla, aga ta ei käivitu ootuspäraselt.

Käivita need käsud


printf '#!/bin/sh\necho tere\n' > tere.sh
chmod +x tere.sh
./tere.sh

printf '#!/usr/bin/env perl\nprint \"tere\\n\";\n' > tere.pl
chmod +x tere.pl
./tere.pl

Minitest

  1. Tee fail proov.sh, mis väljastab ühe rea.
  2. Anna talle täitmisõigus.
  3. Käivita fail nii sh proov.sh kui ./proov.sh.

Peatüki täisspikker

Baas ja süsteemipilt

Eesmärk

loe õiguste rida, mõista rwx tähendust ja erista faili käivitatavust kataloogi läbikäigust

Põhikujud

  • ls -l fail.txtloe õiguste rida
  • chmod u+x skript.shanna omanikule täitmine
  • chmod 644 naide.txtsea tekstifaili õigused
  • chmod 755 skript.shsea käivitatava õigused
  • sudo chown kasutaja:grupp fail.txtmuuda omanikku

Olulised õigusekujud

  • rloe sisu
  • wmuuda sisu
  • xkäivita või sisene
  • dtegu on kataloogiga
  • 644omanik rw, teised r
  • 755omanik rwx, teised rx

Kasutajad, grupid ja sudo

Loogika

Unix-laadsed süsteemid eeldavad, et igal tegevusel on tegija. Seetõttu on oluline aru saada, millise kasutajana sa töötad, millistesse gruppidesse kuulud ja millal on vaja kõrgemaid õigusi.

Kiirülevaade

Eesmärk on teha nähtavaks, kes käsu käivitab ja millal kasutatakse kõrgemaid õigusi.

KäskMilleksMida tavaliselt näed
whoaminäita praegust kasutajatüks kasutajanimi
idnäita kasutaja tunnuseid ja gruppepikem rida UID/GID ja gruppidega
groupsnäita gruppe lühemaltgrupinimede loend
sudo käskkäivita üks käsk kõrgemate õigustegaparooliviip või veateade
sudo -lkontrolli lubatud sudo käskelubade loend või keeld

Tüüpilised algaja vead

  • arvatakse, et sudo tähendab „paranda see käsk võluväel ära“
  • jäädakse pikaks ajaks root-i või kõrgemate õigustega shelli
  • käivitatakse ohtlik käsk sudo-ga enne, kui kontrollitakse, kus parajasti ollakse

Esimene kontroll


whoami
id
groups

Need kolm käsku ei muuda midagi. Võrdle nende üksikasjalikkust: whoami vastab ühe nimega, groups annab grupinimed lühidalt ja id näitab sama teavet tehnilisemalt UID/GID numbritega.


sudo -l

sudo -l kontrollib, milliseid kõrgemate õigustega käske sinu kasutaja käivitada tohib. Kui see küsib parooli, on see normaalne.

Miks ettevaatlik olla

sudo annab suure võimu. Vale käsk kõrgemate õigustega võib:

  • kustutada süsteemifaile
  • muuta õigusi valesti
  • paigaldada või eemaldada tarkvara

Seega tasub enne sudo käivitamist mõelda, kas seda on päriselt vaja.

Mis on root

root on Unix-laadsete süsteemide eriline administraatori kasutaja.

Oluline loogika:

  • tavakasutaja töötab piiratud õigustega
  • root võib peaaegu kõike
  • sudo annab tavakasutajale võimaluse käivitada mõni üksik käsk ajutiselt kõrgemate õigustega

Seega ei ole root ja sudo päris sama asi:

  • root on kasutaja
  • sudo on tööriist, millega mõni käsk käivitatakse kõrgemate õigustega

Kuidas root viibas ära tunda

Sageli on root-kasutaja viiba lõpus märk #, tavakasutajal aga $ või %.

Näited:


kasutaja@mac proov % whoami
kasutaja

root@server:/etc# whoami
root

See ei ole küll absoluutne reegel, kuid väga levinud rusikareegel on:

  • $ või % tähendab tavakasutajat
  • # tähendab, et tasub olla eriti ettevaatlik

Kui on kahtlus, kontrolli alati:


whoami
id

sudo käsk vs sudo -i vs su -

Kõige ohutum tavakasutus on enamasti:


sudo käsk

Näiteks:


sudo apt update
sudo systemctl restart ssh

See on hea, sest kõrgemad õigused kehtivad ainult sellele ühele käsule.

On olemas ka kujud:


sudo -i
su -

Need annavad sulle root-shelli või vahetavad kasutajat. See tähendab, et järgmised käsud töötavad juba kõrgemate õigustega seni, kuni sellest shellist väljud.

Algajale on see riskantsem, sest:

  • viip võib muutuda
  • iga järgmine käsk võib teha suurema mõjuga muudatuse
  • on lihtne unustada, et sa ei ole enam tavakasutaja

Seepärast on hea algreegel:

  • eelista sudo käsk
  • väldi püsivat root-shelli, kui selleks ei ole selget põhjust

Mida root-ina mitte teha

Hea ettevaatusreegel on: ära tee harjutusi, failide sorteerimist ega igapäevast tekstitööd root-kasutajana.

Väldi eriti:

  • rm -rf käske root-kasutajana
  • failide juhuslikku chown või chmod muutmist süsteemikaustades
  • harjumust „kui ei tööta, siis pane sudo ette“

Parem mõtteviis on:

  1. proovi käsku tavakasutajana
  2. loe veateadet
  3. mõtle, kas probleem on õigustes või hoopis milleski muus
  4. kasuta sudo ainult siis, kui tead, miks seda vaja on

Minitest

  1. Vaata oma kasutaja gruppe.
  2. Uuri, milliseid käske tohib sinu kasutaja sudo abil käivitada.
  3. Selgita oma sõnadega, miks sudo rm -rf ... on ohtlik.
  4. Selgita ühe lausega, mis vahe on root kasutajal ja käsul sudo.

Peatüki täisspikker

Baas ja süsteemipilt

Eesmärk

õpi nägema, millise kasutajana sa töötad, millistes gruppides oled ja millal on sudo päriselt vajalik

Põhikujud

  • whoamikontrolli kasutajat
  • idloe grupid välja
  • groupsvaata grupinimesid
  • sudo -lvaata sudo õigusi
  • sudo apt updateüks kõrgem käsk
  • su - kasutajavaheta kasutajat

Olulised märgid ja rollid

  • $tavaline kasutaja
  • %teine levinud tavaviip
  • #root või kõrgemad õigused
  • rootadministraatori kasutaja
  • sudo -iava kõrgem shell
  • sudo käskeelista ühte käsku

Muutujad, keskkond, PATH ja aliased

Shell ei käivita ainult programme. Ta hoiab ka väärtusi, otsustab, kust käske otsida, ja võib anda käskudele lühinimesid.

Kiire orientiir

KujuMilleksMida tavaliselt näed
nimi='Mari'loo shellimuutujaedukal juhul vaikne
echo "$nimi"näita muutuja sisuväärtus terminalis
export NIMI='väärtus'anna väärtus alamprotsessideleedukal juhul vaikne
envvaata keskkonnamuutujaidridade loend
echo "$PATH"vaata käsuotsingu teidkoolonitega eraldatud teed
command -v python3vaata, mis käsk leitaksefailitee või tühi väljund
type cdvaata käsu liikisisekäsk, alias, failitee või muu
type -a grepnäita kõik sama nimega vastedmitu võimalikku vastet
alias ll='ls -lah'loo lühinimiedukal juhul vaikne
source ~/.zshrckäivita faili käsud praeguses zsh-stulemus sõltub faili sisust

Tüüpilised algaja vead

  • pannakse nimi=väärtus juurde tühikud, näiteks nimi = Mari
  • arvatakse, et shellimuutuja on automaatselt kõigile programmidele nähtav
  • muudetakse PATH-i nii, et kogemata varjutatakse süsteemi käsk
  • usaldatakse ainult käsku which ega märgata aliast või shelli sisseehitatud käsku
  • lisatakse alias valesse seadistusfaili ja imestatakse, miks uus terminaliaken seda ei tunne
  • kopeeritakse viiba muutmise näide püsivasse faili enne, kui seda ajutiselt prooviti

Shellimuutuja ja keskkonnamuutuja

Shellimuutuja elab praeguses shellis.


nimi='Mari'
echo "$nimi"

Kui käivitad uue programmi, ei pruugi tavaline shellimuutuja sinna kaasa minna.


nimi='Mari'
sh -c 'echo "$nimi"'

Keskkonnamuutuja tehakse alamprotsessidele nähtavaks käsuga export.


export PROJEKT='linux-opik'
sh -c 'echo "$PROJEKT"'

Põhireegel:

  • nimi='Mari' sobib väärtuseks praeguses shellis
  • export NIMI='Mari' sobib siis, kui käivitatav programm peab seda nägema

Hea tava on kirjutada keskkonnamuutujad sageli suurte tähtedega, näiteks PATH, HOME, EDITOR, SHELL.

Tühikud ja jutumärgid

Muutuja omistamisel ei panda võrdusmärgi ümber tühikuid.

Õige:


nimi='Mari'

Vale:


nimi = 'Mari'

Kui väärtuses on tühik, pane väärtus jutumärkidesse.


projekt='Linuxi õpik'
echo "$projekt"

Muutuja lugemisel eelista kuju:


echo "$projekt"

Jutumärgid hoiavad väärtuse koos ka siis, kui sees on tühikuid.

Mis asi käsk on

Terminali kirjutatud nimi ei tähenda alati välist programmi failisüsteemis.

See võib olla:

LiikNäideMärkus
aliasllshell asendab lühinime käsuga
shelli funktsioonmycmdkasutaja või seadistusfaili määratud funktsioon
sisekäskcdshelli sisseehitatud käsk
reserveeritud sõnaif, forshellikeele osa
väline programmgrep, python3fail kuskil PATH kataloogis

Seetõttu on õppimisel väga kasulik:


type cd
type grep
type ll
command -v python3

type ütleb käsu liigi. command -v ütleb lühidalt, mida shell käivitaks.

Kui sama nimega vasteid on mitu:


type -a python3
type -a grep

See aitab näha, kas eespool on näiteks Homebrew, Conda, süsteemi Python või sinu enda skript.

PATH: kust käsk leitakse

Kui kirjutad käsu:


python3

siis shell otsib väliseid programme muutujas PATH loetletud kataloogidest.


echo "$PATH"

Tüüpiline kuju on selline:


/Users/kasutaja/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin

Oluline reegel:

  • teed on eraldatud kooloniga
  • otsitakse vasakult paremale
  • esimene sobiv käivitatav fail võidab

Kontrolli alati päris vastet:


command -v python3
command -v grep

Kui käsk ei leidu, on tavaliselt üks kahest põhjusest:

  • programm pole paigaldatud
  • programmi kataloog pole PATH-is

Oma bin kataloog

Oma väikesed skriptid võib panna näiteks kataloogi ~/bin või ~/.local/bin.

Loo kataloog:


mkdir -p "$HOME/bin"

Lisa see praeguses shellis otsingutee ette:


export PATH="$HOME/bin:$PATH"

Ette lisamine tähendab, et sinu ~/bin vaste leitakse enne süsteemi sama nimega käsku. See on mugav, aga nõuab tähelepanu.

Ettevaatlikum kuju on lisada oma kataloog lõppu:


export PATH="$PATH:$HOME/bin"

Sel juhul jäävad süsteemi tavalised käsud eelisjärjekorda.

Väike oma käsk

Tee üks väike käsurea tööriist oma ~/bin kataloogi.


mkdir -p "$HOME/bin"
cat > "$HOME/bin/opik-tere" <<'EOF'
#!/bin/sh
echo "Tere oma bin-kataloogist"
EOF
chmod +x "$HOME/bin/opik-tere"
export PATH="$HOME/bin:$PATH"
command -v opik-tere
opik-tere

Siin:

  • fail opik-tere on väike shelliskript
  • chmod +x teeb selle käivitatavaks
  • kataloogi lisamine muutujasse PATH lubab skripti käivitada nimega opik-tere
  • command -v opik-tere kinnitab, kust käsk leitakse

Kui see töötab ainult praeguses aknas, on põhjus lihtne: export PATH=... oli ajutine. Püsivaks muutmiseks lisa rida shelli seadistusfaili.

Seadistusfailid

Shell loeb käivitumisel seadistusfaile. Täpne fail sõltub shellist ja sellest, kas tegu on sisselogimisshelli või interaktiivse shelliga.

Praktiline algaja jaotus:

ShellKuhu panna aliased ja mugavusedKuhu pannakse sageli PATH-i muudatused
zsh~/.zshrc~/.zprofile või ~/.zshrc
bash~/.bashrc~/.bash_profile või ~/.bashrc

Kui sa ei taha veel käivitusfailide üksikasjadesse süveneda, alusta aktiivse shelli interaktiivsest failist:

  • zsh: ~/.zshrc
  • bash: ~/.bashrc

Näide zsh jaoks:


cat >> ~/.zshrc <<'EOF'
export PATH="$HOME/bin:$PATH"
alias ll='ls -lah'
EOF
source ~/.zshrc

Näide bash jaoks:


cat >> ~/.bashrc <<'EOF'
export PATH="$HOME/bin:$PATH"
alias ll='ls -lah'
EOF
source ~/.bashrc

Shelli seadistusfailide põhjalikumad näited on lisas Lisa F: shelli seadistusfailid bash ja zsh jaoks.

Aliased

Alias on lühinimi sagedase käsu jaoks.


alias ll='ls -lah'
alias la='ls -A'
alias gs='git status'
alias h='history | tail -n 20'

Alias sobib hästi siis, kui ta lühendab tuttavat käsku, aga ei peida olulist loogikat.

Vaata olemasolevaid aliaseid:


alias
type ll

Eemalda alias praeguses shellis:


unalias ll

Väldi aliaseid, mis teevad ohtliku käsu liiga „mugavaks“. Näiteks rm ümberkirjutamine võib aidata ühes shellis, kuid tekitada vale turvatunde teises masinas.

Miks which võib petta

Paljud kasutavad käsku:


which grep

Õppimiseks eelista:


type grep
command -v grep

Põhjus:

  • which keskendub sageli välistele programmidele
  • type näitab ka aliaseid ja sisekäske ning arvestab shelli vaatenurka
  • command -v on lühike ning sobib hästi kontrolliks

Kui „käsk käitub imelikult“, alusta kontrollist:


type käsk
type -a käsk

Viip ja ajalugu lühidalt

Viip (prompt) on tekst enne käsu sisestamist. See ei ole käsu osa.

Näide:


~/projekt %

Kui viip näitab üht asja ja oled ebakindel, kontrolli asukohta käsuga:


pwd

Ajutine lihtne viip zsh-is:


PROMPT='%# '

Ajutine lihtne viip bash-is:


PS1='$ '

Viiba mall on shellimuutuja, mitte terminaliakna seadistus. Vaata seda muutmata kujul printf '%s\n' "$PS1"; zsh-s sobib ka print -r -- "$PROMPT". Näed malli koode, mitte tingimata ekraanile joonistatud viipa.

terminal.cs.ut.ee laadse ajutise viiba jaoks vali üks, oma shelli kuju:


PROMPT='user@terminal:%~$ '

PS1='user@terminal:\w$ '

Need nimed on viiba näidistekst, mitte kasutajakonto ega arvuti nime muutmine. Proovi ainult praeguses shellis. Püsiseadistusi selgitab shelli seadistusfailide lisa.

Viiba lihtsustamine ei muuda praegust töökataloogi.
Viiba lihtsustamine ei muuda praegust töökataloogi.
  1. pwd näitab kataloogi täielikku teed.
  2. Viiba mall asendatakse lühikese dollarimärgiga.
  3. Järgmine pwd kinnitab, et kataloog jäi samaks.
  4. zsh mall %~ %# toob viipa tagasi lühendatud tee ja lõpumärgi.

Ajaloo vaatamiseks piisab alguses:


history

Kui torud ja filtrid on juba tuttavad:


history | tail -n 20

Mõned sagedased keskkonnamuutujad

MuutujaTähendus
PATHkust väliseid käske otsitakse
HOMEsinu kodukataloog
SHELLkontole seadistatud sisselogimisshell; ei pruugi olla praegu töötav shell
EDITORvaikimisi tekstiredaktor paljude tööriistade jaoks
LANGkeele- ja lokaadiseadistus

Näited:


echo "$HOME"
echo "$SHELL"
echo "$LANG"
export EDITOR=nano

Kui mõni programm avab ootamatult teise redaktori, kontrolli EDITOR muutujat.

Minitest

  1. Loo shellimuutuja nimi='Mari' ja kuva see.
  2. Loo keskkonnamuutuja DEMO=1 ning kontrolli seda käsuga env.
  3. Vaata oma PATH muutujat.
  4. Kontrolli, kust leitakse python3 või bash.
  5. Võrdle käske type cd ja command -v cd.
  6. Loo alias ll='ls -lah' ja kontrolli seda käsuga type ll.
  7. Lisa ~/bin ajutiselt PATH-i ette ja kontrolli, et rida muutus.
  8. Selgita ühe lausega, miks PATH järjekord võib olla ohtlik.

Peatüki täisspikker

Baas ja süsteemipilt

Eesmärk

erista shellimuutujat, keskkonnamuutujat, käsuotsingu teed ja aliast; PATH-i järjekord otsustab, milline väline käsk esimesena leitakse.

Põhikujud

  • nimi='Mari'; echo "$nimi"shellimuutuja kehtib selles shellis
  • export DEMO=1anna muutuja edasi käivitatavatele programmidele
  • env | grep DEMOkontrolli, kas muutuja on keskkonnas
  • echo "$PATH"vaata käskude otsinguteed
  • command -v python3näita käsu lahendust, ka alias või sisekäsk
  • type cdvaata käsu liiki
  • type -a grepnäita kõik vasted
  • export PATH="$HOME/bin:$PATH"pane oma käskude kataloog otsingutee ette
  • alias ll='ls -lah'loo lühinimi sagedasele käsule
  • source ~/.zshrcloe zsh seadistus uuesti

Olulised mõisted

  • nimi='Mari'shellimuutuja
  • export NIMI='Mari'keskkonnamuutuja
  • PATHotsinguteede järjekord
  • $HOME/binoma käskude koht
  • typealias, sisekäsk või programm
  • ~/.zshrczsh seadistusfail
  • ~/.bashrcbash seadistusfail

Paketihaldus: apt, dnf, pacman, brew

Paketihaldur paigaldab tarkvara koos vajalike sõltuvustega ja hoiab süsteemi seisundi jälgitavana. Peamine oskus on valida õige tase: kas paigaldad tööriista kogu süsteemile, oma kasutajale või ainult ühele projektile.

Kiire orientiir

TööriistKus tavaliseltMilleks
aptDebian, Ubuntusüsteemi paketid
dnfFedorasüsteemi paketid
pacmanArch Linuxsüsteemi paketid
brewmacOS, vahel Linuxkasutajataseme tööriistad
python3 -m pipPythonPythoni paketid
npmNode.jsJavaScripti projektid

Vali korraga ainult oma süsteemile või projektile sobiv rida. Ubuntu kasutaja ei käivita Fedora käske ja macOS-i kasutaja ei paigalda Homebrew pakette käsuga sudo apt.

Tüüpilised algaja vead

  • käivitatakse mitu eri distributsiooni paigalduskäsku järjest
  • kasutatakse sudo-t seal, kus paketihaldur seda ei vaja, näiteks Homebrew puhul
  • paigaldatakse Pythoni projektiteek süsteemi, kuigi õigem oleks venv
  • arvatakse, et Homebrew on macOS-is juba olemas
  • ei loeta paigalduslogi lõppu, kus sageli on tegelik veateade või järgmine juhis

Vali oma süsteemi käsk

Otsi paketti enne paigaldamist:


apt search ripgrep
dnf search ripgrep
pacman -Ss ripgrep
brew search ripgrep

Paigalda ainult oma süsteemi rida:


sudo apt install ripgrep
sudo dnf install ripgrep
sudo pacman -S ripgrep
brew install ripgrep

Kontrolli pärast paigaldust:


rg --version
command -v rg

Kui paigaldus õnnestub, näed tavaliselt logi, allalaadimist, sõltuvusi ja lõpuks vaikset käsuviipa. Kui käsk ei ilmu pärast paigaldust nähtavale, kontrolli PATH-i ja ava vajadusel uus terminaliaken.

Miks mõnikord on vaja sudo

Linuxi süsteemipaketid muudavad tavaliselt süsteemi katalooge. Seetõttu kasutatakse tihti:


sudo apt install htop

Homebrew töötab enamasti kasutaja õigustes:


brew install htop

Ära lisa sudo-t lihtsalt harjumusest. Kui paketihaldur seda ei küsi, on parem jätta see kasutamata.

update ja upgrade

Nimed on sarnased, aga tähendus on erinev.

KujuMida teeb
sudo apt updatevärskendab paketinimekirja
sudo apt upgradeuuendab juba paigaldatud paketid
brew updatevärskendab Homebrew pakiretsepte
brew upgradeuuendab Homebrew paketid

Ära käivita suurt upgrade-i siis, kui sul on kohe vaja arvutit tööks või esitluseks. Uuendamine võib võtta aega ja mõnikord küsida lisavalikuid.

Paketi info ja eemaldamine

Vali ainult oma süsteemi rida. Info küsimine on vaatamine; eemaldamine muudab paigaldatud tarkvara.

SüsteemLoe kirjeldustEemalda teadlikult paigaldatud näidispakett
Debian / Ubuntuapt show ripgrepsudo apt remove ripgrep
Fedoradnf info ripgrepsudo dnf remove ripgrep
Arch Linuxpacman -Si ripgrepsudo pacman -R ripgrep
Homebrewbrew info ripgrepbrew uninstall ripgrep

Ära eemalda süsteemiteeke ega pakette, mille rolli sa ei tunne. Loe paketihalduri kavandatud muudatused enne kinnitamist läbi.

Süsteemi paketihaldur ja keele paketihaldur

apt install python3-requests ja python3 -m pip install requests ei ole sama asi.

KujuTaseMillal kasutada
sudo apt install python3-requestssüsteemkui distributsioonipakett on teadlik valik
python3 -m pip install requestsPythonkui paigaldad Pythoni paketi aktiivsesse keskkonda
npm installprojektkui projektis on package.json

Pythoni projektis on tavaliselt parem kasutada virtuaalkeskkonda:


python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install requests
python3 -m pip show requests

Node.js projektis paigaldatakse sõltuvused projekti kataloogis:


npm install
npm list --depth=0
npm run dev

Kui käsk npm run dev ei tööta, vaata kõigepealt package.json faili. Seal on kirjas, millised scripts nimed on üldse olemas.

macOS ja Homebrew

macOS-is on osa Unixi käske juba olemas, aga Homebrew tuleb tavaliselt ise paigaldada. Seda ei pea tegema enne, kui vajad tööriista, mida süsteemis pole või mille uuemat versiooni on vaja.

Näiteks:


brew install ripgrep jq tmux gh

Graafilisi rakendusi paigaldatakse Homebrew'ga sageli valiku --cask abil:


brew install --cask docker-desktop

Kui vajad macOS-is Linuxi võrgukäskude sarnaseid nimesid, on üks võimalus:


brew install iproute2mac

See on valikuline lisakiht. Enamasti piisab macOS-is sisseehitatud käskudest ifconfig, lsof ja netstat.

Kui paigaldus ebaõnnestub

Kõigepealt loe veateate viimaseid ridu. Seal on tavaliselt põhjus.

SümptomTüüpiline põhjusEsimene kontroll
package not foundnimi on vale või nimekiri vanaotsi paketti ja tee vajadusel update
permission deniedkäsk vajab kõrgemaid õigusikasuta süsteemipaketiga sudo, aga mitte pimesi
lock või database is lockedteine paketihaldur töötaboota, ära kustuta lukufaile käsitsi
command not found pärast paigaldustkäsk pole PATH-is või nimi on teinecommand -v nimi, type -a nimi
pip-i või npm-i õiguste vigapaigaldad valesse keskkondakasuta projekti virtuaalkeskkonda või projekti kataloogi

Minitest

  1. Ütle, milline süsteemi paketihaldur sobib sinu masinale.
  2. Otsi sellega paketti ripgrep või htop.
  3. Loe ühe paketi infot ilma seda paigaldamata.
  4. Selgita, miks pip install ja apt install ei ole sama tase.
  5. Kontrolli, kas python3, pip, node ja npm on sinu masinas olemas.
  6. Kui kasutad macOS-i, kontrolli, kas brew on olemas käsuga command -v brew.

Peatüki täisspikker

Baas ja süsteemipilt

Eesmärk

vali õige tase: süsteemi paketihaldur tööriistadele, keele paketihaldur teekidele ja projekti sõltuvused võimalusel projekti sisse

Põhikujud

  • apt search ripgrepotsi Debianis või Ubuntus
  • sudo apt install ripgreppaigalda Debianis või Ubuntus
  • sudo dnf install ripgreppaigalda Fedoras
  • sudo pacman -S ripgreppaigalda Archis
  • brew install ripgreppaigalda Homebrew'ga
  • python3 -m pip install requestspaigalda Pythoni pakett aktiivsesse keskkonda
  • npm installpaigalda projekti Node.js sõltuvused
  • command -v rgkontrolli, kas käsk leitakse

Tööriistad ja tasemed

  • apt, dnf, pacmanLinuxi süsteemipaketid
  • brewmacOS-i kasutajataseme tööriistad
  • updatevärskenda nimekirja või retsepte
  • upgradeuuenda paigaldatud paketid
  • --caskHomebrew graafiline rakendus
  • venvPythoni projekti eraldi keskkond
  • package.jsonNode.js projekti sõltuvused

Lihtne veaotsing käsureal

Alusta täpsest käsust ja veateatest, mitte juhuslikust parandusest. „Ei tööta“ võib tähendada vale failiteed, puuduvat programmi, õiguste probleemi või vale shelli.

Kontrolli ilma parandusi tegemata

Asenda tabelis näidisnimi oma käsu või failiga.

KüsimusKontroll ja tähendus
Kus töötan?pwd näitab praegust täisteed
Kas fail on siin?ls -lah näitab ka peidetud nimesid, suurusi ja õigusi
Kas programm leitakse?command -v python3 annab leitud nime või tee; tühi väljund tähendab, et käsku ei leitud
Kas nimi on alias?type -a python3 näitab Bashi ja zsh leitud variante
Kas faili saan käivitada?ls -l skript.sh näitab õigusi; head -n 1 skript.sh näitab võimalikku shebang-rida
Milline shell töötab?ps -p $$ näitab praegust shelliprotsessi
Kas Bashi süntaks on korrektne?bash -n skript.sh loeb skripti seda käivitamata

bash -n ei tõenda skripti ohutust ega õiget tulemust. See leiab süntaksivigu; failiteed ja käskude tagajärjed tuleb ikka üle vaadata. Tavaline bash skript.sh seevastu käivitab faili päriselt.

Vali järgmine samm veateate järgi

VeateadeKontrolli enne muutmist
command not foundkirjapilt, paigaldus ja PATH; vaata command -v nimi
No such file or directoryasukoht, suhteline tee, suur- ja väiketähed ning jutumärgid tühikutega nime ümber
Permission deniedfaili ja vanemkataloogi õigused; näiteks ls -ld kataloog vaatab kataloogi ennast
syntax errorkas käsu kuju ja kasutatav tõlgendaja sobivad kokku
package not foundpaketi nimi, valitud hoidlad ja paketinimekirja värskus
database is lockedmilline programm vea andis; põhjus võib olla teine paketihaldur või andmebaasi kirjutav protsess

Lukufaili kustutamine ei lõpeta lukku hoidvat protsessi. Ära eemalda lukke ega lisa käsule sudo enne põhjuse leidmist.

Vale failitee

ls "Minu fail.txt" otsib üht tühikuga nime. Ilma jutumärkideta otsiks käsk kahte nime. Suhteline tee ../andmed/sisend.txt sõltub praegusest asukohast; täistee mitte.

Vale shell

echo "$SHELL" näitab tavaliselt kasutajale seadistatud sisselogimisshelli, mitte tingimata praegu töötavat shelli. Ka praegune shell ei määra üksi skripti tõlgendajat: bash skript.sh valib Bashi, sh skript.sh valib sh, otsekäivitus ./skript.sh kasutab shebang-rida.

Kontrolli skripti sisu enne käivitamist. Kui usaldusväärsel oma skriptil puudub täitmisõigus, selgitab selle lisamist õiguste peatükk.

Programm on paigaldatud, kuid ei leita

Vaata echo "$PATH" abil otsinguteid. Pythoni puhul võib vaja olla õige virtuaalkeskkonna aktiveerimist; mõne paigalduse järel uue shelli avamist. Kontrolli ka, kas paketinimi ja käivitatava programmi nimi üldse kattuvad.

Hea veakirjeldus

Abi küsides lisa eesmärk, täpne käsk, täielik veateade ning operatsioonisüsteem ja töökeskkond. Asukoha kirjeldamisel eemalda paroolid, võtmed, isikuandmed ja tundlikud teed; ka logi ei tasu enne ülevaatamist avalikult jagada.

Minitest

  1. Kontrolli, kust sinu shell leiab python3. Kas paigaldatud variante on mitu?
  2. Kasuta meelega olematut failinime ja selgita saadud veateadet.
  3. Miks bash -n skript.sh ja bash skript.sh ei ole samaväärsed kontrollid?
  4. Koosta lühike veakirjeldus nii, et teine inimene saaks sama olukorra turvaliselt taastada.

Peatüki täisspikker

Baas ja süsteemipilt

Eesmärk

kitsenda viga enne parandamist: täpne veateade, asukoht, olemasolu, käsu leitavus, õigused ja shelli/süntaksi kontroll

Kontrollrada

  • pwdkontrolli, kus oled
  • ls -lahvaata faile, õigusi ja peidetud kirjeid
  • command -v rgkas käsk leitakse
  • type -a rgnäita kõik sama nimega vasted
  • ls -l skript.shvaata skripti õigusi
  • head -n 1 skript.shvaata skripti shebang-rida
  • bash -n skript.shkontrolli süntaksit ilma käivitamata
  • grep --helpkinnita käsu süntaks

Levinud veateated

  • command not foundkäsk puudub, nimi vale või pole PATH-is
  • No such file or directorytee, failinimi või asukoht on vale
  • Permission deniedõigus ei luba lugeda, kirjutada või käivitada
  • syntax errorvale shell või vale käsukuju
  • package not foundpaketinimi või nimekiri on vale
  • database is lockedandmebaasi hoiab teine toiming; põhjus sõltub programmist

Võrgu põhitööriistad

Võrgu veaotsingus on tähtis eristada mitut eri küsimust. „Internet ei tööta“, „veebileht ei vasta“ ja „minu programm ei kuula porti“ võivad välja näha sarnased, kuid neid kontrollitakse eri käskudega.

Kiire orientiir

KüsimusLinuxmacOSMida tavaliselt näed
kas host vastabping -c 4 example.comping -c 4 example.comvastuseread või paketikadu
kas veeb vastabcurl -I https://example.com/curl -I https://example.com/HTTP staatus ja päised
millised liidesed onip aifconfigliidesed ja IP-aadressid
mis pordid kuulavadss -ltnlsof -iTCP -sTCP:LISTEN -n -Pkuulavad TCP-pordid

Kui kasutad macOS-i ja ip a või ss annab command not found, siis see on normaalne. Need on Linuxi tööriistad; macOS-is kasuta alguses ifconfig ja lsof.

Tüüpilised algaja vead

  • peetakse ping tulemust veebiteenuse lõplikuks kontrolliks
  • unustatakse, et mõni server ei vasta ping-ile, kuigi veeb töötab
  • kasutatakse Linuxi käske ip ja ss macOS-is ning arvatakse, et midagi on katki
  • vaadatakse kuulavat porti, aga ei eristata 127.0.0.1, 0.0.0.0 ja arvuti tegelikku võrguaadressi
  • kontrollitakse kauget teenust, kuigi probleem on enda arvutis käivitatud programmis

Esimene kontrollrada

Veebiteenuse puhul alusta HTTP-st:


curl -I https://example.com/

Kui tahad näha, kas host vastab ICMP-le:


ping -c 4 example.com

Kui uurid oma masina võrku, vali süsteemi järgi üks rida:


ip a
ifconfig

Kui uurid, kas kohalik teenus kuulab porti, vali süsteemi järgi üks rida:


ss -ltn
lsof -iTCP -sTCP:LISTEN -n -P

Ära käivita Linuxi ja macOS-i variante läbisegi. Vali see, mis sinu süsteemis olemas on.

ping: hosti esimene signaal

ping saadab ICMP-pakette ja mõõdab, kas host vastab.


ping -c 4 example.com

Tulemuse lugemine:

  • vastuseread tähendavad, et host vastas ICMP-le
  • paketikadu tähendab, et osa päringuid ei saanud vastust
  • vastuse puudumine ei tõesta veel, et veebiteenus on maas

Paljud serverid piiravad või blokeerivad ping vastuseid. Seetõttu on veebiteenuse kontrolliks parem järgmine käsk.

curl -I: veebiteenuse kontroll

curl -I küsib ainult HTTP-päised, mitte kogu lehe sisu.


curl -I https://example.com/

Olulised read:

RidaTähendus
HTTP/2 200 või HTTP/1.1 200server vastas edukalt
301, 302, 308server suunab teisele aadressile
404aadressi ei leitud
500 seeriaserveripoolne viga

Kui tahad suunamist jälgida, lisa -L:


curl -I -L https://example.com/

Võrguliidesed: ip a ja ifconfig

Liides on võrguühendus sinu arvutis: Wi-Fi, kaabel, VPN, loopback või virtuaalne adapter.

Linuxis:


ip a

macOS-is:


ifconfig

Alguses otsi ainult kahte asja:

  • kas mõnel liidesel on IP-aadress
  • kas näed loopback-aadressi 127.0.0.1

127.0.0.1 tähendab sinu enda masinat. See on kasulik kohalike teenuste testimisel, aga ei tähenda, et teenus oleks teistele arvutitele nähtav.

Kuulavad pordid

Kui programm peab teenust pakkuma, peab ta tavaliselt kuulama mingit porti. Näiteks:

  • 22 SSH
  • 80 HTTP
  • 443 HTTPS
  • 3000, 5173, 8000, 8080 arenduse kohalikud serverid

Linuxis:


ss -ltn

macOS-is:


lsof -iTCP -sTCP:LISTEN -n -P

Teine macOS-i sisseehitatud vaade:


netstat -anv -p tcp | grep LISTEN

Vaata eriti aadressi osa:

KujuTähendus
127.0.0.1:3000teenus kuulab ainult sinu arvutis
0.0.0.0:3000teenus kuulab kõigil IPv4-liidestel
[::]:3000teenus kuulab IPv6 kaudu kõigil liidestel

Kui brauseris http://localhost:3000 töötab, aga teiselt masinalt ligi ei saa, võib põhjus olla just selles, et teenus kuulab ainult aadressil 127.0.0.1 või tulemüür ei luba ühendust.

Kas port on kaugelt avatud

Kui tahad kontrollida konkreetset hosti ja porti, sobib sageli nc.


nc -vz example.com 443

See ei tõenda, et rakendus töötab õigesti, kuid näitab, kas TCP-ühenduse loomine selle pordiga õnnestub.

Kui nc pole olemas, kasuta veebiteenuse puhul curl -I-d. HTTP jaoks annab see tavaliselt rohkem infot.

macOS: kas pean midagi paigaldama?

Alguses ei pea. macOS-is on võrgukontrolliks piisavalt sisseehitatud tööriistu:

  • ping
  • curl
  • ifconfig
  • lsof
  • netstat
  • sageli ka nc

Kui tahad hiljem Linuxi ip-stiilis käsku, saab lisada:


brew install iproute2mac

See on mugav lisakiht, mitte õpiku eeldus.

Minitest

  1. Tee curl -I päring aadressile https://example.com/.
  2. Tee ping -c 4 example.com ja võrdle, kas see vastab samale küsimusele.
  3. Vaata oma süsteemis võrguliideseid: Linuxis ip a, macOS-is ifconfig.
  4. Vaata, kas sinu masinas kuulab mõni TCP-port.
  5. Selgita ühe lausega, mis vahe on aadressidel 127.0.0.1:3000 ja 0.0.0.0:3000.

Peatüki täisspikker

Baas ja süsteemipilt

Eesmärk

erista nelja küsimust: kas host vastab, kas veeb vastab, millised liidesed on ja kas kohalik teenus kuulab porti

Kontrollrada

  • curl -I https://example.com/kontrolli veebiteenust
  • ping -c 4 example.comkontrolli hosti ICMP vastust
  • ip avaata Linuxi liideseid
  • ifconfigvaata macOS-i liideseid
  • ss -ltnvaata Linuxi kuulavaid TCP-porte
  • lsof -iTCP -sTCP:LISTEN -n -Pvaata macOS-i kuulavaid porte
  • nc -vz example.com 443kontrolli TCP ühendust porti

Olulised võtmed ja vaated

  • curl -Iküsi HTTP-päised HEAD-päringuga
  • curl -Ljärgi HTTP ümbersuunamisi
  • LISTENport kuulab
  • 127.0.0.1ainult oma masin
  • 0.0.0.0kõik IPv4-liidesed
  • ip/ssLinuxi tööriistad
  • ifconfig/lsofmacOS-i põhivariandid

Failide kopeerimine ja sünkroonimine

Vali tööriist allika ja eesmärgi järgi:

VajadusTööriist ja oluline erinevus
koopia samas masinascp; õnnestub tavaliselt vaikides
fail üle SSHscp; näitab enamasti ülekande edenemist
korduv kataloogide sünkrooniminersync; saab enne näidata plaani
fail veebiaadressiltcurl või wget; kumbki ei vaja SSH-kontot

Koopia võib sihtfaili üle kirjutada. Enne suurt ülekannet kontrolli suunda ja seda, kas sihtkohas on säilitamist vajavaid faile.

Kohalik katse

Loo uus katsekoht. cp -R kopeerib rekursiivselt, s.t ka alamkataloogid koos sisuga.


mkdir -p ~/tmp/kopeeri-naide/allikas/alam
cd ~/tmp/kopeeri-naide
printf 'tere\n' > allikas/alam/fail.txt
cp allikas/alam/fail.txt koopia.txt
cp -R allikas allikas-koopia
cat koopia.txt
ls allikas-koopia/alam

Näed teksti tere ja koopiapuus nime fail.txt. Kui katsekataloog oli juba olemas, vali enne alustamist uus nimi: eriti cp -R tulemus sõltub sihtkataloogi olemasolust.

rsync: enne plaan, siis ülekanne

rsync -a kopeerib puu koos tavapäraste õiguste ja ajatemplitega. -v näitab tehtavat, -n teeb kuivkäivituse ilma sihti muutmata.


mkdir siht
rsync -avn allikas/ siht/
rsync -av allikas/ siht/

Esimene käsk näitab plaani, teine teeb koopia. Vaata cat siht/alam/fail.txt abil sisu. Korda sama päris ülekannet: muutumatu faili sisu ei pea uuesti saatma.

Vaikimisi otsustab rsync ülekande vajaduse peamiselt faili suuruse ja muutmisaja järgi, mitte kõiki sisusid läbi lugedes. Valik -c võrdleb kontrollsummasid, kuid nõuab failide lugemist ja võib olla aeglasem. -a ei säilita automaatselt kõiki võimalikke metaandmeid, näiteks ACL-e, laiendatud atribuute ega kõvalinkide seoseid.

Allika lõpu kaldkriips muudab tulemust

Võrdle olemasoleva sihtkataloogi puhul:

KujuKuhu näitefail jõuab
rsync -av allikas/ siht/siht/alam/fail.txt
rsync -av allikas siht/siht/allikas/alam/fail.txt

Esimeses kantakse üle sisu, teises kataloog koos nimega. Võrdle neid enne -n-iga. Ära eelda, et cp ja scp kasutavad lõpu kaldkriipsu kõigis süsteemides täpselt sama reegli järgi.

Vaikimisi ei eemalda rsync sihtkoha lisafaile. --delete eemaldab sihist ülekantava puu ulatuses failid, mida allikas pole; see ei ole tavalise varukoopia jaoks automaatselt vajalik. Kontrolli sellist plaani eriti hoolikalt.

Üle SSH teise masinasse

Asenda kasutaja@server oma kontoga. Järgmised on käsukujud, mitte toimiva näidiskonto aadressid:


scp koopia.txt kasutaja@server:~/
rsync -avn allikas/ kasutaja@server:~/allikas/

scp -r kopeerib kataloogi; scp -p säilitab õigused ning ajad. rsync peab olema mõlemas masinas olemas. Pärast kuivkäivituse kontrolli eemalda -n, kui soovid päris ülekannet. Sisselogimise ja võtmete juhis tuleb SSH peatükis.

Tavakasutaja ei saa üldjuhul määrata failile suvalist omanikku. Metaandmete säilimine sõltub ka sihtfailisüsteemist ja kasutaja õigustest.

Veebist faili toomine

curl -f märgib HTTP veavastuse ebaeduks, -L järgib ümbersuunamisi ning -O võtab kohaliku nime URL-i viimasest teeosast, mitte serveri suvalisest pakutud nimest.

Vali üks allalaadija:


curl -fL -O https://artifical.eu/linux/data/generated-words.txt

Või, kui wget on olemas:


wget https://artifical.eu/linux/data/generated-words.txt

Kontrolli head generated-words.txt abil, et said teksti, mitte sisselogimis- või vealehe. Rohkem valikuid leiad veebist sisu toomise peatükist.

Minitest

  1. Lisa allikafaili üks rida. Mida näitab uus rsync -avn?
  2. Kuidas muudab allika lõpu kaldkriips tulemuse kataloogipuud?
  3. Miks rsync -av pole sama mis kahe kataloogi täielik peegeldamine?
  4. Mida pead üle kontrollima enne faili teise masinasse kopeerimist?

Peatüki täisspikker

Praktiline kasutus

Eesmärk

vali tööriist allika järgi: cp samas masinas, scp üle SSH, rsync korduvaks sünkroonimiseks ja curl/wget veebist toomiseks

Põhikujud

  • cp fail.txt koopia.txttee koopia
  • cp -R kaust kaust-koopiakopeeri kataloog
  • scp fail.txt kasutaja@server:/tmp/saada serverisse
  • rsync -avn kaust/ kasutaja@server:/tmp/kaust/kontrolli enne
  • rsync -av kaust/ kasutaja@server:/tmp/kaust/sünkrooni sisu
  • wget https://artifical.eu/linux/data/generated-words.txtlaadi fail
  • curl -fLO https://artifical.eu/linux/data/generated-words.txtjärgi suunamisi, HTTP-vea korral ebaõnnestu

Olulisemad lipud, märgid ja kiirnupud

  • cp -Rkopeeri kataloog
  • scp -rsaada kataloog
  • rsync -arekursiivselt, säilitades tavalised Unixi metaandmed
  • rsync -nproovi enne
  • curl -Ljärgi suunamist
  • curl -Osalvesta URL-i lõpuosa nimega

Kauglogimine ja SSH

SSH on turvaline viis logida teise masinasse, käivitada seal käske ja liigutada faile. Sama ühendusloogikat kasutavad sageli ka scp, rsync ja Git.

Loogika

SSH töövoog liigub tavaliselt nii:

  1. proovi parooli või olemasoleva võtmega tavalist sisselogimist
  2. kontrolli, kas sul on võtmepaar juba olemas
  3. loo uus võti ainult siis, kui seda on vaja
  4. lisa avalik võti serverisse
  5. määra korduvale ühendusele failis ~/.ssh/config alias
  6. macOS-is lase Apple'i võtmehoidjal (Keychain) võtmefraas meelde jätta

Kõige tähtsam piir on lihtne: privaatvõti jääb sinu arvutisse, avalik võti läheb serverisse.

Kiire orientiir

KüsimusKäsk või failMida näed või teed
kas saan sissessh kasutaja@server.example.orgkaugmasina viip või veateade
millised võtmefailid on olemasls -la ~/.sshid_ed25519, id_ed25519.pub jms
mis võtmed agendis onssh-add -lvõtmete sõrmejäljed või teade, et agent on tühi
loo uus võtissh-keygen -t ed25519privaat- ja avaliku võtme failid
lisa võti macOS-i võtmehoidjasse/usr/bin/ssh-add --apple-use-keychain ~/.ssh/id_ed25519võtmefraas salvestatakse võtmehoidjasse
kasuta aliastssh opik-serverühendus ~/.ssh/config kirje järgi

Esmakordsel ühendusel küsib SSH sageli serveri sõrmejälje kinnitamist. See on serveri tuvastus, mitte sinu kasutajavõti. Kontrolli uut sõrmejälge serveri haldurilt või teisest usaldusväärsest kanalist enne kinnitamist; pelgalt õige aadress ei tõenda serveri ehtsust.

Tüüpilised algaja vead

  • aetakse segi privaatvõti ja avalik võti
  • kirjutatakse olemasolev võti kogemata üle
  • arvatakse, et Apple'i võtmehoidja asendab ~/.ssh võtmefailid
  • lisatakse serverisse privaatvõti, kuigi lisada tuleb ainult .pub fail
  • seadistatakse keeruline pordi- või agendiedastus enne, kui tavaline sisselogimine töötab
  • unustatakse, et faili ~/.ssh/config aliaseid saavad kasutada ka scp, rsync ja Git

Esimene ühendus

Kõigepealt proovi kõige tavalisemat kuju:


ssh kasutaja@server.example.org

Pärast sisselogimist käivad käsud kaugmasina kohta. Tagasi kohalikku shelli saad käsuga exit.

Kui port ei ole tavaline 22, lisa port:


ssh -p 2222 kasutaja@server.example.org

Ühekordse kaugkäsu saab anda nii:


ssh kasutaja@server.example.org 'hostname && uptime'

Kui see veel ei tööta, ära alusta võtmete ümbertegemisest. Enne kontrolli kasutajanime, hostinime, porti ja veateadet.

Kas sul on võtmed juba olemas?

Vaata kõigepealt oma ~/.ssh kataloogi.


ls -la ~/.ssh

Tüüpilised failid:

FailTähendus
id_ed25519privaatvõti; ära saada kellelegi
id_ed25519.pubavalik võti; see lisatakse serverisse
configühenduste aliased ja seaded
known_hostsserverite sõrmejäljed
authorized_keysserveris lubatud avalikud võtmed

Kontrolli võtme sõrmejälge:


ssh-keygen -lf ~/.ssh/id_ed25519.pub

Kontrolli, mis võtmed on praegu ssh-agent-is:


ssh-add -l
ssh-add -L

ssh-add -l näitab sõrmejälgi. ssh-add -L näitab agendis olevate võtmete avalikke ridu. Kui agent on tühi, ei tähenda see, et võtmefaile pole olemas; see tähendab ainult, et agent ei hoia neid praegu mälus.

Uue võtme loomine

Ära kirjuta olemasolevat võtit üle. Kui ~/.ssh/id_ed25519 on juba olemas ja kasutusel, kasuta seda või loo eraldi nimega võti.

Tavaline uus võti:


ssh-keygen -t ed25519 -C 'kasutaja@arvuti'

Kui tahad eraldi õpiku või serveri võtit:


ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_opik -C 'opik-server'

Soovitus: määra privaatvõtmele võtmefraas. See kaitseb võtit ka siis, kui fail satub kogemata valesse kohta.

Õigused peavad olema kitsad:


chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub

Kui kasutasid teise nimega võtit, kasuta käsus vastavat failinime.

macOS: võtmehoidja ja ssh-agent

macOS-is on kaks eri asja:

  • ssh-agent hoiab võtmeid jooksva kasutusseansi ajal mälus
  • Apple'i võtmehoidja (Keychain) saab hoida privaatvõtme võtmefraasi, et sa ei peaks seda iga kord uuesti sisestama

Võtmehoidja ei asenda võtmefaile. Privaatvõti on endiselt näiteks ~/.ssh/id_ed25519; võtmehoidja aitab selle võtmefraasi hallata.

Kasuta Apple'i tööriista /usr/bin/ssh-add: näiteks Homebrew kaudu paigaldatud samanimeline programm ei pruugi Apple'i valikuid toetada. Lisa võti agendile ja salvesta võtmefraas võtmehoidjasse:


/usr/bin/ssh-add --apple-use-keychain ~/.ssh/id_ed25519

Kui võtmefraas on juba võtmehoidjas ja tahad võtmed agendile laadida:


/usr/bin/ssh-add --apple-load-keychain

Kui tahad võtme ainult jooksvast agendist eemaldada:


ssh-add -d ~/.ssh/id_ed25519

Kui tahad eemaldada ka võtmehoidjasse salvestatud võtmefraasi, kasuta eemaldamisel Apple'i võtmehoidja valikut:


/usr/bin/ssh-add --apple-use-keychain -d ~/.ssh/id_ed25519

Vanemates macOS-i juhendites näeb vahel käske ssh-add -K ja ssh-add -A. Tänapäevasem ja selgem kuju on kasutada --apple-use-keychain ja --apple-load-keychain.

Kontrolli pärast:


ssh-add -l

Kui ssh-add ütleb, et agenti ei saa ühendada, ava uus terminaliaken ja proovi uuesti. macOS-is käivitab graafiline kasutajaseanss agendi tavaliselt ise.

~/.ssh/config: aliased ja püsiseaded

Kui ühendud sama serveriga korduvalt, määra seadistusfailis alias.


Host opik-server
    HostName server.example.org
    User kasutaja
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes

Pärast seda töötavad lühemad käsud:


ssh opik-server
scp fail.txt opik-server:/tmp/
rsync -av kaust/ opik-server:/tmp/kaust/

IdentitiesOnly yes on kasulik siis, kui agendis on palju võtmeid. See ütleb SSH-le, et selle hosti puhul kasuta eelkõige siin nimetatud võtit.

macOS-i mugav plokk võib olla selline:


Host *
    IgnoreUnknown UseKeychain
    AddKeysToAgent yes
    UseKeychain yes

Host opik-server
    HostName server.example.org
    User kasutaja
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes

IgnoreUnknown UseKeychain peab olema enne rida UseKeychain, sest Linuxi OpenSSH ei pruugi Apple'i valikut tunda. Nii töötab sama seadistusfail paremini mitmes süsteemis.

Config-faili õigused:


chmod 600 ~/.ssh/config

Avaliku võtme lisamine serverisse

Serverisse lisatakse avalik võti, mitte privaatvõti.

Kui ssh-copy-id on olemas:


ssh-copy-id -i ~/.ssh/id_ed25519.pub kasutaja@server.example.org

Kui ssh-copy-id puudub, kuva avalik võti:


cat ~/.ssh/id_ed25519.pub

macOS-is saad selle lõikelauale panna nii:


pbcopy < ~/.ssh/id_ed25519.pub

Seejärel lisa see avalik rida serveris faili ~/.ssh/authorized_keys. Serveris peavad õigused olema tavaliselt:


chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Failide kopeerimine sama aliasega

Kui ~/.ssh/config alias töötab ssh-iga, töötab see sageli ka kopeerimisel.


scp fail.txt opik-server:/tmp/
rsync -av kaust/ opik-server:/tmp/kaust/

Korduva töö puhul eelista rsync-i ja proovi enne:


rsync -avn kaust/ opik-server:/tmp/kaust/

Veaotsing

Kõige kasulikum esimene diagnostikakäsk on:


ssh -v opik-server

See näitab:

  • millist seadistusfaili kirjet kasutatakse
  • millist hosti ja porti proovitakse
  • milliseid võtmeid pakutakse
  • kas viga on ühenduses, serveri sõrmejäljes või autentimises

Kui väljund on liiga pikk, otsi sealt ridu Offering public key, Authentications that can continue ja Permission denied.

Mis jääb hilisemaks

SSH-l on ka võimsamad töövõtted:

  • pordiedastus (port forwarding): ssh -L ...
  • agendiedastus (agent forwarding): ssh -A ...
  • hüppemasinad: ProxyJump
  • püsivad ühendused: ControlMaster

Need on kasulikud, aga tulevad pärast seda, kui tavaline sisselogimine, võtmed ja ~/.ssh/config aliased on selged.

Minitest

  1. Vaata, kas sul on ~/.ssh kataloog ja millised võtmefailid seal on.
  2. Selgita, kumb on privaatvõti ja kumb avalik võti.
  3. Kontrolli, kas ssh-agent hoiab praegu mõnd võtit.
  4. Kirjuta näidis Host opik-server plokk ~/.ssh/config jaoks.
  5. Selgita, mida teeb macOS-is /usr/bin/ssh-add --apple-use-keychain.
  6. Kirjuta ühe lausega, miks UseKeychain ei tähenda, et võti oleks serverisse lisatud.

Lisalugemine

Selle teema usaldusväärsemad viited leiad lisast Lisa E: usaldusväärsed viited ja lisalugemine.

Peatüki täisspikker

Praktiline kasutus

Eesmärk

tee SSH korduvkasutatavaks: kontrolli olemasolevaid võtmeid, lisa avalik võti serverisse, kasuta failis ~/.ssh/config määratud aliast ja macOS-is Apple'i võtmehoidjat

Põhirada

  • ssh kasutaja@server.example.orgproovi tavalist sisselogimist
  • ls -la ~/.sshvaata olemasolevaid võtmefaile
  • ssh-add -lvaata agendis olevaid võtmeid
  • ssh-keygen -t ed25519 -C 'kasutaja@arvuti'loo võti ainult vajadusel
  • /usr/bin/ssh-add --apple-use-keychain ~/.ssh/id_ed25519macOS: salvesta võtmefraas võtmehoidjasse
  • ssh-copy-id -i ~/.ssh/id_ed25519.pub kasutaja@server.example.orglisa avalik võti serverisse
  • ssh opik-serverkasuta seadistusfaili aliast
  • ssh -v opik-serverdiagnostika

Olulised failid ja mõisted

  • id_ed25519privaatvõti; ära jaga
  • id_ed25519.pubavalik võti serverisse
  • ~/.ssh/configühenduse alias
  • ~/.ssh/authorized_keyslubatud võtmed
  • known_hostsserverite sõrmejäljed
  • AddKeysToAgentlisa võtmed agenti
  • UseKeychainvõtmefraas macOS-i võtmehoidjas
  • IdentitiesOnly yeskasuta nimetatud võtit

Veebist sisu toomine ja tekstivaade: curl, wget, lynx

Loogika

Veebist sisu toomisel tasub kõigepealt eristada kolme eri ülesannet:

  1. too üks vastus või fail
  2. laadi alla terve lehtede puu või jätka katkenud allalaadimist
  3. vaata HTML-i loetava tekstina või kogu sealt linke

Just selle järgi tasub tööriist valida:

  • curl ühe päringu, päiste, API või toor-HTML jaoks
  • wget allalaadimise, jätkamise ja veebis roomamise jaoks
  • lynx HTML-i tekstivaate ja linkide loendi jaoks

Veebikraapimine (scraping) tähendab siin veebist saadud sisu edasist töötlemist käsureal. Kui ametlik API või andmefail on olemas, eelista seda peaaegu alati HTML-i kraapimisele.

Enne kui kraabid

Enne automaatset allalaadimist tasub alati kontrollida mõnda lihtsat asja:

  • kas saidil on olemas API või andmeeksport
  • kas robots.txt või kasutustingimused lubavad seda tööd
  • kas saad alustada väikese prooviga, mitte kohe terve domeeniga
  • kas lisad päringute vahele pausi, kui teed korduvaid tõmbeid
  • kas suudad hiljem tõestada, kust andmed tulid ja millal sa need tõid

Hea reegel on alustada ühe URL-iga, kontrollida tulemust ja alles siis mõelda ulatuslikumale roomamisele.

Kiirülevaade

Eesmärk on veebist sisu tuua kontrollitult: alusta väikesest proovist ja vaata enne, mida server vastab.

KäskMilleksMida tavaliselt näed
curl -I URLküsi ainult päisedHTTP staatus ja päised
curl URLtee üks päringvastuse sisu terminalis
wget URLlaadi fail allaedenemine ja faili nimi
lynx -dump URLvaata HTML-i tekstinalihtsustatud tekstivaade

Päiste vaatamine aitab enne suuremat tõmmet aru saada, kas aadress töötab ja kas server suunab sind mujale.

Tüüpilised algaja vead

  • alustatakse kohe ulatuslikku roomamist, enne kui üks URL on kontrollitud
  • aetakse segi „too üks vastus“ ja „laadi fail alla“
  • unustatakse, et mõistlik on eelistada API-t või andmefaili HTML-i kraapimisele

Kui tööriist puudub

curl on sageli juba olemas, kuid wget ja lynx ei pruugi igas süsteemis vaikimisi paigaldatud olla.

Vali ainult oma süsteemile sobiv paigalduskäsk:

Debianis või Ubuntus:


sudo apt install wget lynx

Fedoras:


sudo dnf install wget lynx

macOS-is Homebrew kaudu:


brew install wget lynx

curl: üks vastus korraga

curl on hea siis, kui tahad täpselt kontrollida, mis päring tehakse ja mida vastuseks saadakse.

Olulised lipud alguses:

  • -I ainult päised
  • -L järgi ümbersuunamisi
  • -o fail salvesta kindla nimega
  • -O salvesta serveri pakutud nimega
  • -s vaikne režiim
  • -S näita viga ka siis, kui kasutad -s

Näited:


curl -I https://example.com/
curl -L -o esileht.html https://example.com/
curl -sL https://example.com/ | grep -i '<title'
curl -sL https://example.com/ | lynx -stdin -dump

Praktiline mõte on siin lihtne:

  • curl kirjutab vaikimisi väljundi ekraanile
  • seetõttu sobib ta hästi torude ja filtritega
  • curl ise ei tee „veebipuud“, vaid ühe või mõne konkreetse päringu

wget: allalaadija ja veebis roomaja

wget on mugav siis, kui tahad, et fail päriselt kettale jääks, või kui tahad teha piiratud rekursiivset allalaadimist.

Olulised lipud alguses:

  • -O fail salvesta kindla nimega
  • -c jätka katkenud allalaadimist
  • -P kaust salvesta kindlasse kausta
  • --recursive rekursiivne allalaadimine
  • --level=1 või -l 1 piira sügavust
  • --no-parent ära mine ülemkataloogidesse
  • --page-requisites tõmba lehe toimimiseks vajalikud failid
  • --convert-links muuda lingid lokaalses koopias sobivaks
  • --adjust-extension pane HTML-failidele sobiv laiend
  • --wait=1 ja --random-wait aeglusta roomamist

Näited:


wget https://example.com/
wget -O esileht.html https://example.com/
wget -c -O esileht-koopia.html https://example.com/

Piiratud ulatusega roomamine:


wget --recursive --level=1 --no-parent https://example.com/

Kui tahad teha lokaalse koopiana väikest dokumentatsioonipuud, siis mall on näiteks selline:


wget \
  --mirror \
  --convert-links \
  --adjust-extension \
  --page-requisites \
  --no-parent \
  --wait=1 \
  --random-wait \
  https://docs.example.org/juhend/

Seda viimast käsku ei tasu kunagi pimesi suure saidi juures käivitada. Kõigepealt kontrolli alati:

  • kui suur ala sul tegelikult vaja on
  • kas --no-parent ja õige alg-URL piiravad töö piisavalt kitsaks
  • kas serverile on mõistlik teha nii palju päringuid

lynx: HTML tekstiks ja lingid eraldi

lynx on kasulik siis, kui veebileht on vaja teha kiiresti loetavaks tekstiks.

See on hea tööriist näiteks siis, kui:

  • tahad lehte lugeda terminalist
  • tahad HTML-ist saada lihtsa tekstivaate
  • tahad linkide nimekirja eraldi kätte
  • tahad torust tuleva HTML-i kiiresti puhastada enne grep-i või sed-i

Kõige tavalisemad töökujud:


lynx https://example.com/
lynx -dump https://example.com/
lynx -dump -listonly https://example.com/

Kui HTML on juba failis, saad sama teha kohalikult:


lynx -dump naide-curl.html
lynx -dump -listonly naide-curl.html

Vahe on lihtne:

  • lynx URL on interaktiivne tekstibrauser
  • lynx -dump URL väljastab ekraanile loetava tekstivaate
  • lynx -dump -listonly URL väljastab ainult lingid

Väike veebikraapimise töövoog

Kui eesmärk ei ole „terve sait alla“, vaid „too üks leht ja töötle seda“, siis üks praktiline töövoog on:


curl -L -o leht.html https://example.com/
lynx -dump leht.html > leht.txt
grep -n 'Example' leht.txt
lynx -dump -listonly leht.html > lingid.txt
wc -l lingid.txt

See töövoog on hea, sest iga samm on kontrollitav:

  1. tõmbad algse HTML-i faili
  2. teed sellest inimesele loetava tekstiversiooni
  3. otsid tekstist mustrit
  4. võtad lingid eraldi nimekirjana välja

See seob hästi kokku ka peatükid grep, sed, sort ja awk.

Mida tasub meeles pidada

  • curl sobib paremini üksikute päringute ja torude jaoks
  • wget sobib paremini allalaadimiseks ja veebis roomamiseks
  • lynx ei ole roomaja, vaid tekstivaate ja linkide tööriist
  • HTML-i kraapimine on habras, sest lehe struktuur võib muutuda
  • JavaScriptiga loodud sait ei pruugi anda curl-ile või wget-ile sama sisu, mida näeb brauser

Kui näed, et info tuleb lehele alles JavaScripti abil, siis puhas curl või wget ei pruugi sulle tegelikku sisu anda. Siis tasub otsida:

  • ametlikku API-t
  • JSON-vastust brauseri võrgupaneelist
  • ekspordifaili, näiteks CSV või JSON

Minitest

  1. Tee curl -I päring aadressile https://example.com/.
  2. Salvesta sama leht korraga nii curl-i kui wget-iga.
  3. Muuda üks HTML-fail lynx -dump abil tekstiks.
  4. Trüki lynx -dump -listonly abil välja ainult lingid.
  5. Seleta ühe lausega, millal kasutaksid curl, millal wget ja millal lynx.

Peatüki täisspikker

Praktiline kasutus

Eesmärk

vali curl ühe vastuse või päiste jaoks, wget allalaadimise jaoks ja lynx HTML-i rahulikuks tekstivaateks

Põhikujud

  • curl -I https://example.com/kontrolli URL-i
  • curl -L -o leht.html https://example.com/salvesta HTML
  • wget -O leht.html https://example.com/laadi faili
  • curl -fsSL https://example.com/ | lynx -stdin -dumploe tekstina
  • lynx -dump -listonly https://example.com/kogu lingid

Olulisemad lipud, märgid ja kiirnupud

  • curl -Ivaata päiseid
  • curl -Ljärgi suunamist
  • curl -Osalvesta URL-i lõpuosa nimega
  • wget -cjätka tõmmet
  • lynx -dumptekstvaade
  • lynx -listonlyainult lingid

Arhiivid ja pakkimine

Loogika

Arhiveerimine koondab failid, pakkimine teeb need väiksemaks. See on seotud failide liigutamise, allalaadimise ja varukoopiatega.

Kiirülevaade

Erista kaht sammu: failide koondamine üheks arhiiviks ja selle arhiivi tihendamine väiksemaks.

Käsk või formaatMilleksMida tavaliselt näed
tarkoonda failid arhiiviksedukal loomisel võib olla vaikne
gzip, xztihenda arhiiv väiksemakstekib tihendatud fail
.tar.gztar + gzip koosüks kokkupakitud arhiiv
ziparhiiv ja tihendus ühes vormingustekib .zip fail
tar -tfvaata arhiivi sisufailide loend
tar -xf, unzippaki lahtitar sageli vaikne, unzip näitab faile

Tüüpilised algaja vead

  • arvatakse, et .tar tähendab juba tihendatud faili
  • pakitakse arhiiv lahti vales kataloogis
  • ei vaadata enne lahtipakkimist, mis arhiivi sees on

Tähtsamad valikud

  • c create ehk loo arhiiv
  • x extract ehk paki lahti
  • t table ehk näita sisu
  • f file ehk järgmine argument on arhiivifaili nimi
  • z kasuta gzip pakkimist
  • J kasuta xz pakkimist
  • v verbose ehk näita töö käigus rohkem infot

tar põhimõte

tar ise on ajalooliselt arhiveerija. Pakkimine lisatakse sageli eraldi:

  • tar ainult koondab failid
  • gzip teeb faili väiksemaks
  • xz pakib tihedamalt, aga võib olla aeglasem

Sellepärast on need kujundid sisuliselt järgmised:

  • tar -cf loo arhiiv ilma pakkimata
  • tar -czf loo gzip-ga pakitud arhiiv
  • tar -xzf paki gzip-ga pakitud arhiiv lahti
  • tar -cJf loo xz-ga pakitud arhiiv

.tar.gz ja .tgz tähendavad tavaliselt sama asja. .tgz on lihtsalt lühem failinimi.

Käivita need käsud


mkdir -p ~/tmp/arh/kaust
printf 'tere\n' > ~/tmp/arh/kaust/tere.txt
tar -cf ~/tmp/arh/proov.tar -C ~/tmp/arh kaust
tar -tf ~/tmp/arh/proov.tar

tar -czf ~/tmp/arh/proov.tar.gz -C ~/tmp/arh kaust
tar -xzf ~/tmp/arh/proov.tar.gz -C ~/tmp/arh

zip -r ~/tmp/arh/proov.zip ~/tmp/arh/kaust
unzip ~/tmp/arh/proov.zip -d ~/tmp/arh/unzipped

Millal mida kasutada

  • tar.gz on väga levinud Linuxi maailmas
  • tar.xz sobib siis, kui tihendusaste on tähtis
  • zip on mugav, kui faile jagatakse erinevate süsteemide vahel

Metaandmed ja puustruktuur

Arhiiviformaadi valikul ei loe ainult tihendusaste. Loeb ka see, mida arhiiv peab kaasa võtma.

  • tar sobib hästi Unix-laadse puustruktuuri jaoks
  • tar säilitab failipuud, õigused, ajatemplid ja lingid paremini kui zip
  • zip on sageli mugavam jagamiseks eri süsteemide vahel
  • zip ei ole tavaliselt parim valik siis, kui Unixi õigused ja omanikud on olulised

Praktiline mõtteviis:

  • Linuxi või serveri varukoopia: eelista sageli tar.gz või tar.xz
  • laiemaks jagamiseks: zip

Kasulikud võtted

  • tar -tf fail.tar.gz näitab sisu ilma lahti pakkimata
  • tar -tzf fail.tar.gz | less laseb suure arhiivi sisu sirvida
  • tar -xzf fail.tar.gz -C sihtkaust pakib lahti kindlasse kohta
  • tar -czf backup-$(date +%F).tar.gz kaust/ teeb kuupäevaga varukoopia
  • unzip -l fail.zip näitab zip-arhiivi sisu ilma lahti pakkimata

Kui arhiiv on suurem, lehitse sisuloendit:


tar -tzf fail.tar.gz | less

See aitab enne lahtipakkimist näha:

  • mis kaustad seal sees üldse on
  • kas arhiivis on ootuspärane juurkataloog
  • kas failinimed paistavad mõistlikud

Minitest

  1. Loo väike testkaust kahe failiga.
  2. Tee sellest tar.gz arhiiv.
  3. Vaata arhiivi sisu ilma seda lahti pakkimata.
  4. Paki arhiiv lahti teise kausta.

Peatüki täisspikker

Praktiline kasutus

Eesmärk

arhiiv koondab failid; tihendamine võib mahtu vähendada, kuid juba pakitud sisu puhul mitte tingimata

Põhikujud

  • tar -cf proov.tar kaust/loo arhiiv
  • tar -tf proov.tarvaata sisu
  • tar -czf proov.tar.gz kaust/loo gzip-arhiiv
  • tar -xzf proov.tar.gz -C siht/paki lahti sihtkohta
  • zip -r proov.zip kaust/loo zip
  • unzip -l proov.zipvaata zip sisu

Olulisemad lipud, märgid ja kiirnupud

  • tar -cfloo arhiiv
  • tar -tfvaata sisu
  • tar -czfgzip-iga kokku
  • tar -xzfpaki gzip lahti
  • zip -rpaki kataloog ZIP-arhiivi
  • unzip -lvaata zip sisu

Tervete kataloogipuude haldus ja jagamine

Üksikfaili kopeerimise asemel tuleb projekti jagamisel otsustada, mis kaasa läheb ja kuidas tulemust kontrollida. Siinne harjutus ühendab sünkroonimise ja arhiivid; üksikkäskude lipud leiad neist peatükkidest.

Vali eesmärgi järgi

VajadusSobiv viisPiirang
Proovi muudatust kohalikus koopiascp -Rsama nimega sihtfail võib üle kirjutuda
Uuenda olemasolevat koopiatrsync, algul proovikäivitussünkroonimine võib kopeerida ka eksimuse
Saada üks kindel hetkeseistar.gz või ZIPjärgmist versiooni jagad eraldi
Tee koostööd ja jälgi muudatusiGitei talleta kõiki faile ega failisüsteemi metaandmeid

Varukoopia pole lihtsalt teine kataloog samal kettal. Kettarikke vastu aitab eraldi andmekandja või masin; kogemata muudetud faili taastamiseks on vaja ka varasemaid versioone.

Koosta jagatav koopia

Harjutame enda loodud failidega. Punktiga algav .env tähistab siin seadistusfaili, milles päris projektis võivad olla saladused. Näites saladusi ei ole.


mkdir -p ~/tmp/jagamise-naide/projekt/cache
cd ~/tmp/jagamise-naide
printf '%s\n' 'Projekti juhend' > projekt/README.txt
printf '%s\n' 'AINULT_NAIDIS=1' > projekt/.env
printf '%s\n' 'taasloodav sisu' > projekt/cache/ajutine.txt

rsync --exclude jätab mustrile vastavad kirjed ülekandest välja. Allika lõpu / valib kataloogi sisu. -avn säilitab tavalised Unixi metaandmed, loetleb kavandatud töö ja teeb ainult proovikäivituse:


rsync -avn --exclude='.env' --exclude='cache/' projekt/ jagamiseks/

Loendis peab olema README.txt, kuid mitte .env ega cache/ajutine.txt. Kui tulemus sobib, korda sama käsku ilma n-ita:


rsync -av --exclude='.env' --exclude='cache/' projekt/ jagamiseks/
ls -la jagamiseks

Väljajätmine ei kustuta varem sihtkohta sattunud saladusi. Kasuta jagamiseks uut puhast kataloogi. Ära lahenda seda pimesi valikuga --delete.

Kontrolli ka taastamist

Paki jagatav koopia arhiivi, vaata liikmete loendit ja ava arhiiv eraldi kataloogi. -C määrab olemasoleva lahtipakkimiskoha.


tar -czf jagamiseks.tgz jagamiseks/
tar -tf jagamiseks.tgz
mkdir taastatud
tar -xzf jagamiseks.tgz -C taastatud
diff -r jagamiseks taastatud/jagamiseks

diff -r võrdleb kataloogide faile rekursiivselt. Vaikne väljund tähendab siin, et failisisus erinevusi ei leitud; see ei kinnita kõigi õiguste, omanike ega ajatemplite võrdsust. Järgmine kord vali uus taastamiskataloog, mitte ära kirjuta vana testi üle.

rsync -a ei hõlma automaatselt kõiki ACL-e, laiendatud atribuute ega kõvalinke. Git omakorda ei säilita näiteks failide omanikke, ajatemplite ajalugu ega tühje katalooge. Täpseks süsteemivarunduseks vali selleks mõeldud lahendus ja testi taastamist.

Minitest

  1. Lisa projekti teine tekstifail. Kas proovikäivitus leiab ainult vajaliku täienduse?
  2. Muuda taastatud koopias üht rida. Milline diff -r väljund tekib?
  3. Miks ei tõesta sama failide arv või kataloogimaht veel koopiate võrdsust?
  4. Millist varundust vajaksid, et taastada eilne versioon pärast tänast eksimust?

Peatüki täisspikker

Praktiline kasutus

Eesmärk

terve projekti või kataloogipuu puhul vali tööriist selle järgi, kas tahad koopiat, korduvat sünkroonimist, arhiivi või versiooniajalugu

Põhikujud

  • cp -R projekt projekt-koopiatee kohalik koopia
  • rsync -avn projekt/ projekt-varu/kontrolli enne
  • rsync -av projekt/ kasutaja@server:/srv/projekt/sünkrooni serverisse
  • scp -r projekt kasutaja@server:/tmp/saada kiirelt
  • tar -czf projekt.tgz projekt/tee hetkearhiiv
  • gitjälgi ajalugu

Olulisemad lipud, märgid ja kiirnupud

  • projekt/rsync-allikas: kataloogi sisu
  • projektrsync-allikas: kataloog ise
  • rsync -nproovi enne
  • cp -asäilita metaandmed

Protsessid, tööd ja signaalid

Protsess on töötav programmi eksemplar, millel on süsteemi protsessinumber ehk PID. Shelli töö võib koosneda ühest või mitmest protsessist, näiteks torust. Signaal on protsessile saadetav juhtsõnum.

Vaata, mis töötab

KäskTulemus
psselle terminaliga seotud protsesside hetkeseis
ps auxlaiem loend koos omaniku, PID-i, CPU ja mälu kasutusega
topuuenev protsessivaade; välju q-ga
jobs -lselle shelli töönumbrid, seisud ja PID-id

htop on eraldi paigaldatav mugavam jälgimisvaade. CPU ja mälu näitude tähendus ning arvutusvahemik sõltuvad tööriistast; üks hetkepilt ei tõesta pikaajalist koormust.

ps aux tavaväljundis on kolmas veerg CPU protsent ja neljas mälu protsent. sort -nrk sordib valitud veeru arvuliselt kahanevaks; head jätab kümme esimest rida:


ps aux | sort -nrk 3 | head
ps aux | sort -nrk 4 | head

Need annavad kiire ülevaate, kuid päiserida ei püsi eraldi päisena. Pikema jälgimise jaoks kasuta top-i.

Järjest või korraga

sleep N ootab N sekundit. Tavaliselt ootab shell käsu lõppu enne järgmise alustamist; ; eraldab järjestikuseid käske.


sleep 3; echo 'pikk töö valmis'
sleep 1; echo 'lühike töö valmis'

Esimene teade ilmub umbes kolme, teine nelja sekundi järel. Nüüd võrdle taustatöödega: & lubab shellil kohe edasi minna, sh -c käivitab jutumärkides oleva käsujada eraldi shellis ja wait ootab oma taustatööde lõppu.


sh -c 'sleep 3; echo "pikk töö valmis"' &
sh -c 'sleep 1; echo "lühike töö valmis"' &
jobs
wait

Tavaliselt ilmub hiljem alustatud lühikese töö teade esimesena ning mõlemad lõpevad umbes kolme sekundiga. Käivitamisjärjekord ei määra lõpetamisjärjekorda. Kui sisestad ridu aeglaselt, võib töö enne jobs-i juba valmis olla.

Peata ja jätka sama tööd

Tee see katse interaktiivses shellis, mitte ühe kopeeritud skriptina.

  1. Käivita sleep 120, vajuta Ctrl-z. Programm peatub ja viip tuleb tagasi.
  2. Käivita veel kord sleep 120 ning vajuta jälle Ctrl-z.
  3. Vaata jobs -l. Otsi oma kahe sleep-töö numbrid.
  4. Kui need on 1 ja 2, jätka esimest käsuga bg %1 ja too teine ette käsuga fg %2.
  5. Katkesta esiplaani töö Ctrl-c-ga. Too esimene ette fg %1 ja katkesta ka see.

Kasuta tegelikke töönumbreid, mitte tingimata 1 ja 2. %1 on praeguse shelli töönumber; paljas number käsule kill tähendab PID-i. bg ja fg jätkavad sama programmi, mitte ei käivita seda algusest.

Lõpetamine ja signaalid

TegevusMõju
Ctrl-csaadab esiplaani protsessigrupile tavaliselt SIGINT katkestussoovi
Ctrl-zsaadab tavaliselt SIGTSTP ajutise peatamise signaali
kill PIDvaikimisi SIGTERM: programm saab viisakalt lõpetada
kill -KILL PIDsunnitud lõpetamine; programm ei saa enam koristada ega salvestada

Ära proovi suvalist PID-i. Harjutuseks käivita oma ootaja ja salvesta $! kaudu viimase taustaprotsessi PID muutujasse:


sleep 120 &
ootaja=$!
ps -p "$ootaja"
kill "$ootaja"

Võid näha shelli teadet Terminated. Sunnitud lõpetamine on viimane abinõu, mitte veaotsingu algus.

Väike kohalik server

Python peab olema paigaldatud. Loo eraldi kataloog, milles pole isiklikke faile. --bind 127.0.0.1 lubab ühendusi ainult sellest arvutist; muidu kuulab Pythoni server vaikimisi ka võrguliideseid.


mkdir -p ~/tmp/serveri-naide
cd ~/tmp/serveri-naide
printf '%s\n' 'Tere kohalikust serverist!' > index.html
python3 -m http.server 8000 --bind 127.0.0.1 &
serveri_pid=$!

Ava brauseris localhost:8000. Kui port on hõivatud, vali teine port nii käsus kui aadressis. Lõpetamiseks kasuta samas shellis kill "$serveri_pid". See lõpetab ainult sinu salvestatud PID-iga protsessi.

Kas töö jääb akna sulgemisel alles?

& üksi seda ei taga. Interaktiivse kaugtöö jaoks kasuta tmux-i või screeni.

nohup paneb käivitatava programmi eirama ühenduse katkemisega seotud SIGHUP-signaali. Suuna ka sisend ja väljund terminalist eemale:


nohup sh -c 'sleep 10; echo "valmis"' < /dev/null > nohup-naide.log 2>&1 &

Kümne sekundi pärast peaks logis olema valmis. nohup ei kaitse taaskäivituse, voolukatkestuse ega administraatori sessioonipuhastuse eest.

Bashi ja zsh disown eemaldab töö shelli tööde loendist; see ei vabasta programmi automaatselt terminalisisendist ega -väljundist. Kasuta seda vaid siis, kui tead programmi sõltuvusi.

Minitest

  1. Muuda paralleelkatse ooteajad viieks ja kaheks sekundiks. Ennusta järjestikuse ja samaaegse variandi kogukestus.
  2. Miks ei näe uus terminaliaken vana akna jobs-loendit?
  3. Mis vahe on peatatud ja lõpetatud programmil?
  4. Käivita kohalik server, vaata selle PID-i ning lõpeta ainult see protsess. Kontrolli brauseris, et teenus enam ei vasta.

Peatüki täisspikker

Praktiline kasutus

Eesmärk

erista protsessi, shelli tööd ja signaali: vaata, millised protsessid töötavad, peata vajadusel ning jätka pikka tööd taustal

Põhikujud

  • ps aux | grep pythonotsi protsess
  • ps aux | sort -nrk 3 | headsuur CPU kasutus selles hetkepildis
  • ps aux | sort -nrk 4 | headsuur mälukasutus
  • sleep 300 &käivita taustal
  • jobsvaata töid
  • fg %1too töö ette
  • topjälgi reaalajas
  • killsaada signaal
  • bgjätka taustal

Olulisemad lipud, märgid ja kiirnupud

  • Ctrl-ckatkesta programmi töö
  • Ctrl-zpeata ajutiselt; fg ette, bg taustale
  • &käivita taustal
  • %1töö number
  • kill -15viisakas lõpp
  • kill -9jõuga lõpp

Logid ja teenused

Teenus on süsteemi hallatav taustatöö; selle olek ütleb, kas see töötab, logi aitab mõista juhtunut. Üks teenus võib käivitada mitu protsessi. Alusta olekust, seejärel vaata sama teenuse hiljutisi teateid.

systemd-ga Linux

Järgmised käsud vajavad systemd-d. Need ei ole macOS-i käsud ega tööta igas Linuxi konteineris või WSL-i seadistuses. systemctl uurib teenust, journalctl loeb süsteemipäevikut.

KäskMida näed
systemctl status sshteenuse olek, käivituse andmed ja viimased teated
journalctl -u ssh -n 50-u valib teenuse, -n viimaste kirjete arvu
journalctl -u ssh --since todaykirjed alates tänase päeva algusest
journalctl -u ssh -f-f jääb lisanduvaid kirjeid ootama; lõpeta Ctrl-c-ga

SSH-teenus võib olla nimega sshd, mitte ssh, või üldse paigaldamata. Asenda näites nimi oma teenusega. Unit ... could not be found ei tähenda sama mis olemasoleva teenuse failed-olek. Lehitsetavast vaatest välju q-ga.

Olek active ja käivitamisel lubatud olek enabled ei ole sama: teenus võib praegu töötada, kuid mitte järgmisel alglaadimisel. -- No entries -- ei tõesta vigade puudumist; põhjuseks võivad olla vale nimi, piiratud lugemisõigus või teistsugune logimine.

macOS kasutab teenuste halduseks launchd-d ja süsteemilogide jaoks muu hulgas käsku log show. Tavalise tekstilogiga saad mõlemas süsteemis teha järgmise katse.

Vaata logi kasvamist kahes aknas

Loo esimeses terminalis oma näidislogi. printf kirjutab ühe rea, > kirjutab samanimelise faili üle. Ära kasuta selleks päris teenuse logi.


mkdir -p ~/tmp/logi-naide
cd ~/tmp/logi-naide
printf '%s\n' 'INFO teenus käivitus' > app.log
tail -f app.log

Näed algset rida ja käsk jääb ootama. Teises terminalis kasuta täisteed, sest uus aken ei pruugi olla samas kataloogis. >> lisab lõppu, mitte ei kirjuta algust üle:


printf '%s\n' 'WARN ühendus aeglane' 'ERROR ühendus katkes' >> ~/tmp/logi-naide/app.log

Esimesse aknasse ilmuvad uued read. Katkesta seal jälgimine Ctrl-c-ga; see ei kustuta logi ega lõpeta seda kirjutanud teenust. Käsk tail -n 2 app.log näitab nüüd ainult kaht viimast rida.

Leia oluline sündmus

Päris logis on tavaliselt ajatempel, tähtsusaste ja sõnum. Märksõnad nagu ERROR, failed ja denied aitavad alustada, kuid loe ka ümbritsevaid ridu: viimane viga võib olla varasema vea tagajärg.

Otsingu peatükis õpid eraldama veakirjeid käsuga grep. Suuremat näidislogi pakub õpiku andmefail.

Süsteemi tekstilogid võivad asuda näiteks /var/log/syslog või /var/log/messages, kuid need failid ei pea sinu süsteemis olemas olema. Ära loo puuduvat süsteemilogi käsitsi ega muuda päris logide õigusi lihtsalt vaatamise hõlbustamiseks.

Minitest

  1. Lisa näidislogisse kolmas sündmus ja vaata, kuidas see esimesse aknasse ilmub.
  2. Kuidas erinevad tail -n 2 ja tail -f?
  3. Kui kasutad systemd-ga Linuxit, leia üks olemasolev teenus ja võrdle selle olekut viimaste logiteadetega.
  4. Miks ei tõesta tühi logivaade, et teenus töötab veatult?

Peatüki täisspikker

Praktiline kasutus

Eesmärk

Kontrolli teenuse olekut ja seejärel sama teenuse logi. systemctl/journalctl vajavad systemd-ga Linuxit.

Käsud ja näited

  • systemctl status sshteenuse seis ja hiljutised teated; nimi võib olla sshd
  • journalctl -u ssh -n 50selle teenuse viimased 50 kirjet
  • journalctl -u ssh --since todaytänased teenusekirjed
  • journalctl -u ssh -fjälgi juurde tulevaid kirjeid
  • tail -n 20 app.logtavalise logifaili lõpp, ka ilma systemd-ta
  • tail -f app.logjälgi faili; Ctrl-c lõpetab jälgimise

Püsivad terminalisessioonid: tmux ja screen

tmux hoiab shelli ja selles käivitatud töö serveris alles ka pärast SSH-ühenduse katkemist. Hiljem saad sama sessiooni juurde tagasi tulla. Käivita tmux sellel masinal, kus töö peab jätkuma, kaugkasutuses seega pärast serverisse logimist.

See ei kaitse serveri väljalülitamise, taaskäivituse ega protsessi krahhi eest. Taustamärk & üksi ei anna samuti püsivat terminalisessiooni.

Katse: lahku ja tule tagasi

tmux new -s opik loob nimega opik sessiooni ja avab selle sees uue shelli. Kui sessioon on juba olemas, vali teine nimi või ühendu olemasolevaga.


tmux new -s opik

Nüüd oled sessiooni sees. Käivita lühike ootamine:


sleep 60

Vajuta Ctrl-b, lase klahvid lahti ja vajuta d. See on eraldumine (*detach*), mitte väljumine: sleep jätkab tööd.

Nüüd oled sessioonist väljas. tmux ls loetleb sessioonid; attach -t valib sessiooni, mille juurde naasta:


tmux ls
tmux attach -t opik

Kui minut pole möödunud, ootab sleep endiselt. Muidu näed taas viipa. Vajadusel katkesta ootamine Ctrl-c-ga. exit lõpetab sessioonis oleva shelli; kui see oli viimane aken, lõpeb ka sessioon. Ära aja exit-it segi eraldumisega.

Sama tööviis screen-iga

Kui masinas on tmux asemel screen, kasuta neid vasteid:

Toimingscreen-i kuju
loo nimega sessioonscreen -S opik
eraldu sessiooni seestCtrl-a, seejärel d
loetle väljast sessioonidscreen -ls
naase väljast sessiooniscreen -r opik

Vali üks tööriist; mõlemat pole vaja sama katse sees käivitada.

Sessioon või üks taustatöö?

tmux ja screen säilitavad terminali, millega saab uuesti ühenduda. Protsesside peatüki nohup muudab ühe töö käitumist ühenduse katkemisel ning disown eemaldab töö shelli tööde loendist; kumbki ei anna sama terminalivaadet tagasi.

Minitest

  1. Loo nimega sessioon, eraldu ja ühendu uuesti.
  2. Millisel masinal peab sessioon töötama, et sülearvuti sulgemine serveritööd ei lõpetaks?
  3. Mis vahe on eraldumisel, exit-il ja serveri taaskäivitamisel?

Peatüki täisspikker

Praktiline kasutus

Eesmärk

Säilita interaktiivne serverisessioon ka SSH-ühenduse katkemisel.

Käsud ja näited

  • tmux new -s katseloo nimega sessioon
  • tmux lsloetle sessioonid välisest shellist
  • tmux attach -t katseühendu olemasoleva sessiooniga
  • screen -S katsealternatiiv: loo screeni sessioon
  • screen -r katsetaasühendu eraldatud screeniga

Märgid ja valikud

  • Ctrl-b, siis dtmux: eraldu, töö jätkub
  • Ctrl-a, siis dscreen: eraldu, töö jätkub
  • exitlõpeta praeguse akna shell

Graafilised rakendused kaugmasinast

Selles peatükis vaatame, millal kasutada X11-edastust, millal veebiliidest ja mis on praktilised piirangud.

Loogika

Kaugelt graafilise rakenduse kasutamiseks on mitu võimalust, kuid need ei ole võrdselt mugavad. Enamasti tasub eelistada veebiliidest või IDE Remote SSH lahendust ning jätta X11-edastus erijuhtudeks.

Kiirülevaade

Eesmärk on otsustada, kas graafilist programmi on vaja üle võrgu näidata või sobib paremini veebiliides või IDE kaugühendus.

LahendusMilleksMida tavaliselt näed
ssh -Xsaada X11-rakenduse aken sinu masinasseterminal on vaikne, aken võib avaneda eraldi
ssh -Ltoo serveri port oma localhost aadressileSSH-seanss jääb lahti, brauser kasutab kohalikku aadressi
Remote SSH IDE-sredigeeri oma arvutis, käivita serverisIDE-s serveri failipuu ja terminal
veebiliidesjäta graafika brauseri tööksHTTP-aadress brauseris

Tüüpilised algaja vead

  • proovitakse X11-edastust enne, kui tavaline ssh töötab
  • unustatakse, et pordiedastuse käsus ja brauseris viitavad kaks localhost-i eri masinatele
  • arvatakse, et GUI-edastus on alati parim tee, kuigi veebiliides või Remote SSH on sageli kiirem ja töökindlam
  • jäetakse pordiedastus liiga laialt avatuks; alguses hoia seos ainult oma masinaga

Käivita need käsud


ssh -X kasutaja@server

Veebiliidese puhul peab serveris juba töötama teenus pordil 8888. Järgmine käsk käivitatakse sinu arvutis: -L teeb pordiedastuse, 127.0.0.1 piirab kohaliku kuulamise selle arvutiga ja -N jätab kaugshelli avamata.


ssh -N -L 127.0.0.1:8888:localhost:8888 kasutaja@server

Hoia ühendus lahti ning ava kohalikus brauseris localhost:8888. Tunneli loomine ei käivita teenust ega asenda selle autentimist. Lõpeta tunnel Ctrl-c-ga.

Käsu ja brauseri kaks localhost-i viitavad eri masinatele:

  • käsus olev localhost:8888 on serveri enda vaade teenusele
  • brauseris avatav http://localhost:8888 on sinu arvuti vaade edasisuunatud pordile

X11-edastus

See võib töötada lihtsate X-rakendustega, kuid:

  • on sageli aeglane
  • vajab kohalikku X-serverit
  • ei sobi alati moodsatele GUI-rakendustele

Veebiliides

Sageli on praktilisem kasutada teenuseid, mis töötavad brauseris:

  • Jupyter
  • veebipõhine adminliides
  • kaugserveris jooksev rakendus HTTP kaudu

Minitest

  1. Uuri, kas sinu masinas on X11-server ja kaugmasinas sobiv X11-rakendus ning lubatud X11-edastus.
  2. Pane kirja üks juhtum, kus veebiliides on mõistlikum kui X11.
  3. Selgita, miks Remote SSH võib olla arenduses mugavam kui vahetu X11-edastus.

Peatüki täisspikker

Praktiline kasutus

Eesmärk

kaugelt graafika kasutamisel eelista lihtsaimat toimivat teed: veebiliides enne X11-edastust, port forwarding enne toorest kaugtöölauda.

Põhikujud

  • ssh -N -L 127.0.0.1:8888:localhost:8888 kasutaja@servertunnel juba töötava serveriteenuseni
  • http://localhost:8888ava edasi suunatud teenus
  • ssh -X kasutaja@serverproovi lihtsat X11
  • code --remote ssh-remote+server /tee/projektiniIDE üle SSH

Valiku rusikareeglid

  • veebiliidestavaliselt mugavaim
  • ssh -Lport edasi
  • ssh -XX11 erijuht
  • Remote SSHarenduseks parem

Teksti otsimine: grep ja sugulased

grep valib sisendist mustriga sobivad read. Ta ei muuda faili ega kuva vaikimisi ainult leitud sõna: välja tuleb terve rida. Sobimatu tähesuurus või mustri erimärk võib tulemust oluliselt muuta.

Esimene võrdlus

Valmista enda harjutuskataloogis väike fail. > kirjutab sama nimega faili üle.


printf 'kass\nkoer\nKass\nkassipoeg\n' > loomad.txt
grep 'kass' loomad.txt

Näed kass ja kassipoeg, mitte Kass. Otsing võib leida vaste ka pikema sõna seest.

ValikTähendusKatse
-ieira tähesuurustgrep -i 'kass' loomad.txt leiab ka Kass
-nlisa reanumbergrep -n 'koer' loomad.txt annab 2:koer
-xmuster katab terve reagrep -x 'kass' loomad.txt jätab kassipoeg välja
-vvali mittesobivad readgrep -iv 'kass' loomad.txt jätab ainult koer
-cloenda vastega ridugrep -c 'kass' loomad.txt annab 2

Lipud võivad koos töötada. -c ei loenda kõiki sõna esinemisi: kui ühel real on kolm vastet, on see ikkagi üks vastega rida.

Vasteta otsing annab tavaliselt tühja väljundi ja lõpetuskoodi 1; leitud vaste annab 0, viga tavaliselt 2. Seega ei tähenda iga nullist erinev kood siin riket.

Täpne tekst või regulaaravaldis

Vaikimisi on muster regulaaravaldis: näiteks punkt . tähendab üht suvalist märki. -F lülitab mustrikeele välja ja otsib täpset teksti. See ei nõua veel tervet rida; selleks lisa -x.


printf 'fail.json\nfailXjson\n' > nimed.txt
grep '.json' nimed.txt
grep -F '.json' nimed.txt

Esimene leiab mõlemad read, teine ainult fail.json. Shelli jutumärgid hoiavad mustri ühe argumendina, kuid ei lülita grep-i mustrikeelt välja.

MusterTähendus
^#rea alguses on #
json$rida lõpeb tekstiga json
.üks suvaline märk
[0-9]üks number
.*null või rohkem suvalisi märke
[0-9]+ koos -E-gavähemalt üks number

-E valib laiendatud regulaaravaldised. Vanade käsunimede egrep ja fgrep asemel kasuta grep -E ja grep -F.

Otsi kataloogipuust

-r otsib rekursiivselt. Anna nii muster kui ka alguskataloog; suurtes puudes võib otsing aega võtta.


grep -rn 'TODO' .

Tulemuse ees on failinimi ja reanumber. GNU grep-i -R järgib lisaks otsingu käigus leitud sümbollinke; -r ja -R ei ole lihtsalt kaks kirjapilti samale lipule. Ära otsi alguseks kogu juurkataloogist ega peida ligipääsuveateateid.

Sõnamõistatus, mille tulemust saab kontrollida

-x 'a.t.l' nõuab viiemärgilist rida: esimene märk a, kolmas t ja viies l. Tee väike kontrollitav sõnaloend:


printf '%s\n' antal aptal artal artel astel attal axtel kass > words.txt
grep -x 'a.t.l' words.txt

Vasteks on esimesed seitse rida, mitte kass. Suuremaks otsinguks sobib õpiku genereeritud näidisloend; see ei ole kontrollitud loomuliku keele sõnastik ning vastete arv sõltub andmetest.

Jätk pärast sortimise peatükki

See katse kasutab ka sortimist ja koondamist. grep -o . väljastab iga leitud märgi eraldi; sort toob võrdsed märgid kokku, uniq -c loendab need ja sort -nr järjestab arvuliselt kahanevalt:


grep -x 'a.t.l' words.txt | grep -o . | sort | uniq -c | sort -nr

Tähe a loendus on 11, t loendus 8 ja l loendus 7. Katse ühendab otsingu ja lihtsa statistika. Tähesuuruse ühtlustamist õpetab teksti teisendamine.

Edasijõudnule: korduva tüki leidmine

GNU grep -E toetab tagasiviiteid, kuid nende tugi laiendatud regulaaravaldistes pole kõigi tööriistade vahel ühesugune. (..) jätab kahe märgi paari meelde, \1 viitab samale paarile ja + nõuab vähemalt üht kordust.


printf '%s\n' aaaaaa a.a.a. ratatat kass | grep -E '(..)\1\1+'

Esimesed kolm rida sobivad: aa, a. või at kordub vähemalt kolm korda. ratatat sees sobib osa atatat; valikuga -x see terve rida enam ei sobiks. Tagasiviited võivad olla aeglased: kasuta neid põhjusega, mitte tavalise tekstihaku asemel.

Minitest

  1. Lisa loomad.txt lõppu rida kass kass. Kuidas muutub grep -c tulemus?
  2. Leia nii kass kui Kass, kuid mitte kassipoeg, ühe käsuga.
  3. Miks erinevad grep '.json' ja grep -F '.json'?
  4. Muuda sõnamõistatuse mustrit ning ennusta tulemus enne käivitamist.
  5. Kuidas eristad „vastet ei leitud“ ja „faili ei saanud lugeda“?

Lisalugemine

Ametlik GNU grep-i juhend ning tekstitöötluse viited.

Peatüki täisspikker

Töövood

Eesmärk

Vali tekstist sobivad read; erista täpset teksti regulaaravaldisest.

Otsingukuju ja tulemus

  • grep 'kass' loomad.txtka pikema sõna sees; väljastab terve rea
  • grep -in 'kass' loomad.txteira tähesuurust, lisa reanumbrid
  • grep -x 'kass' loomad.txtainult tervenisti sobiv rida
  • grep -v '^#' seadistus.confjäta välja # märgiga algavad read
  • grep -F '.json' nimed.txtpunkt tähendab päris punkti, mitte suvalist märki
  • grep -rn 'TODO' .otsi failipuust koos failinimede ja reanumbritega
  • grep -c 'kass' loomad.txtloenda vastega ridu, mitte kõiki esinemisi

grep-i tulemuskoodid

  • 0vähemalt üks vaste
  • 1vasteid pole, mitte tingimata viga
  • 2tavaliselt viga; loe veateadet

Teksti teisendamine: tr, cut, paste, column, strings

Loogika

Need käsud sobivad siis, kui tahad tekstivoo kuju kiiresti muuta ilma pikema skriptita. Need on seotud torude ja otsingupeatükkidega, sest neid kasutatakse sageli kohe pärast grep-i või enne sort-i.

Kiirülevaade

Eesmärk on muuta teksti kuju väikeste tööriistadega, kus iga käsk teeb ühe konkreetse sammu.

KäskMilleksMida tavaliselt näed
trmuuda või kustuta märkemuutunud tekstivoog
cutvõta välja välju või veergeainult valitud osad
pastepane read kõrvutiühendatud read
column -tjoonda tabelilaadseltloetavamad veerud
stringsotsi binaarfailist tekstiloetavad tekstijupid ridadena

Tüüpilised algaja vead

  • aetakse segi märkide muutmine ja väljade lõikamine
  • kasutatakse käsku cut keeruka CSV-failiga, kuigi lihtne eraldaja ei pruugi selle töötlemiseks piisata
  • oodatakse, et column muudab faili, kuigi ta ainult vormib väljundi ilusamaks

Käivita need käsud


echo 'tere maailm' | tr '[:lower:]' '[:upper:]'
echo 'a,b,c' | tr ',' '\n'

printf 'nimi:vanus:linn\nMari:20:Tartu\n' > andmed.txt
cut -d ':' -f 1 andmed.txt
cut -d ':' -f 1,3 andmed.txt

printf 'nimi vanus\nMari 20\nJaan 21\n' | column -t

Päris näide: teksti puhastamine ja veergudeks tegemine

Alusta nii:


cp data/sample-text.txt tekst.txt
head -n 3 tekst.txt

Kui tahad tekstist teha sõnavoo, sobib hästi:


tr ' ' '\n' < tekst.txt | head -n 20

Siin:

  • tr ' ' '\n' muudab tühikud reavahetusteks
  • üks mitmesõnaline rida jaguneb eraldi sõnaridadeks

Kui tahad kõik sõnad suurtähtedeks muuta:


tr '[:lower:]' '[:upper:]' < tekst.txt | head -n 3

See on hea näide, sest siin ei muudeta "mõtet", vaid ainult märkide kuju.

Päris näide: logirea tükeldamine

Fail data/app.log sobib hästi cut-i näitamiseks.


head -n 5 data/app.log
cut -d ' ' -f 1-4 data/app.log | head -n 5

Selle näite loogika:

  • eraldajaks on tühik
  • -f 1-4 võtab välja esimesed neli välja
  • näed kiiresti aega, logitaset, hosti ja moodulit

Kui tahad ainult logitasemeid:


cut -d ' ' -f 2 data/app.log | head -n 10

See on hiljem väga kasulik koos sort ja uniq -c-ga.

Päris näide: tee väljund loetavaks column abil

Kui tahad näidata logi lühikokkuvõtet veergudena, saab teha väikese vahefaili:


cut -d ' ' -f 1-4 data/app.log | head -n 10 | tr '=' ' ' | column -t

Siin toimub korraga mitu asja:

  • cut võtab logi alguse
  • tr '=' ' ' eraldab võtmed ja väärtused loetavamalt
  • column -t joondab väljundi veergudesse

Nii muutub käsuväljund kiirelt tabelina loetavaks.

Päris näide: strings

strings on kasulik siis, kui sisend ei ole tavaline tekstifail.

Lihtne näide süsteemist:


strings /bin/ls | head -n 20

Siin:

  • /bin/ls on binaarfail
  • strings üritab sealt leida loetavaid tekstijuppe

See tuletab meelde, et kõik failid ei ole „lihtsalt tekst“, isegi kui neist saab mõnikord loetavaid tekstijuppe eraldada.

UTF-8, täpitähed ja reavahetused

Tekstitöötluses on veel kaks praktilist detaili, mis tulevad väga kiiresti ette:

  • kodeering, tavaliselt UTF-8
  • reavahetuse kuju, tavaliselt LF või CRLF

Eesti tekstiga on see eriti tähtis, sest ÕÄÖÜ ei ole ASCII-märgid.

Näide:


printf 'Õun\nÄmber\nÖö\nÜks\n' > tahed.txt
cat tahed.txt

Kui fail on UTF-8 kujul, näed täpitähti õigesti.

CRLF vs LF

Linuxis ja macOS-is on tavaline reavahetus LF. Windowsi failides kohtab tihti CRLF.

Näide:


printf 'üks\r\nkaks\r\n' > crlf.txt
cat crlf.txt
tr -d '\r' < crlf.txt > lf.txt

Siin:

  • \r\n teeb Windowsi moodi reavahetuse
  • tr -d '\r' eemaldab CR-märgid (carriage return)
  • tulemuseks saad puhta LF-iga faili

Kui mõni tööriist käitub "imelikult", siis põhjus võib olla just reavahetustes, mitte käsus endas.

Täpitähtega teksti puhul kontrolli tulemust. GNU tr ei toeta mitmebaidiseid märke täielikult; UTF-8 teksti õ, ä, ö ja ü tõstu muutmiseks ei saa sellele üldiselt loota. Siinsed tõstunäited kasutavad ASCII tähti. Unicode'i jaoks sobib näiteks Pythoni sõnemeetod upper().

Minitest

  1. Muuda tekst käsuga tr suurtähtedeks.
  2. Lõika kooloniga eraldatud failist välja teine väli.
  3. Vorminda väike tabel column -t abil.
  4. Võta data/app.log failist välja ainult logitase käsuga cut.
  5. Tee ühest väikesest väljundist veeruline vaade column -t abil.

Peatüki täisspikker

Töövood

Eesmärk

need väikesed filtrid muudavad tekstivoo kuju kiiresti: märgid, väljad, veerud ja tabelid ilma eraldi skriptita

Põhikujud

  • echo 'tere maailm' | tr '[:lower:]' '[:upper:]'muuda suurtäheks
  • echo 'a,b,c' | tr ',' '\n'tee ridadeks
  • cut -d ':' -f 1 andmed.txtvõta esimene väli
  • cut -d ':' -f 1,3 andmed.txtvõta mitu välja
  • printf 'nimi vanus\nMari 20\n' | column -tjoonda tabel
  • strings /bin/ls | head -n 20loe binaarist tekst
  • pastekleebi veerge

Olulisemad lipud, märgid ja kiirnupud

  • [:lower:]väiketähed
  • [:upper:]suurtähed
  • cut -dvali eraldaja
  • cut -fvali väljad
  • column -tjoonda tabel
  • stringstekstijupid

Vood ja tabelid: sort, uniq, wc, pr, join

Loogika

Kui sul on palju ridu, aitab see peatükk neid kokku võtta. Tüüpiline töövoog on: sorteeri, koonda, loenda.

Kiirülevaade

Eesmärk on muuta suur hulk ridu kokkuvõtteks: sortida, loendada, rühmitada ja vajadusel tabelina siduda.

KäskMilleksMida tavaliselt näed
sortsea read järjekordasamad read uues järjekorras
uniqkoonda kõrvuti duplikaadidkorduvad read kaovad või saavad loenduri
wcloenda ridu, sõnu või märkelühike arvuline kokkuvõte
joinühenda kaks faili ühise välja järgiseotud read ühises väljundis
prvormi veergudesse või printimisekslehekülje- või veerupaigutus

Tüüpilised algaja vead

  • kasutatakse käsku uniq sortimata sisendiga ja oodatakse kõigi duplikaatide kadumist
  • aetakse segi ridade loendamine ja sõnade loendamine
  • unustatakse, et join eeldab tavaliselt sobivalt ette valmistatud sisendit

Käivita need käsud


printf 'pirn\noun\npirn\nploom\n' > viljad.txt
sort viljad.txt
sort viljad.txt | uniq
sort viljad.txt | uniq -c

echo 'üks kaks kolm neli' | wc -w
printf 'a\nb\nc\n' | wc -l

printf '1 Mari\n2 Jaan\n' > nimed.txt
printf '1 Tartu\n2 Tallinn\n' > linnad.txt
join nimed.txt linnad.txt
pr -2 viljad.txt

Sõnade loendamine ja tähesuuruse muutmine


echo 'Tere tere maailm' | tr '[:upper:]' '[:lower:]' | tr ' ' '\n' | sort | uniq -c

See on klassikaline Unix-laadne voog: teisenda, jaga ridadeks, sorteeri, loenda.

join eeldab tavaliselt, et mõlemad sisendfailid on ühise välja järgi sorditud. pr on kasulik siis, kui tahad väljundit kiirelt veergudesse või printimiseks vormida.

Näide: kõige sagedasemad sõnad

Kui tahad näha, miks sort | uniq -c | sort -nr on nii klassikaline, siis kasuta näidisandmefaili:


cp data/sample-words.txt sonad.txt
sort sonad.txt | uniq -c | sort -nr | head -n 15

Selle töövoo loogika on:

  • sort toob samad sõnad järjestikku
  • uniq -c loendab järjestikused kordused
  • sort -nr paneb suurimad loendused ette

Just see on üks Unix-laadse tekstitöötluse põhivõtteid.

Päris näide: logitasemete kokkuvõte

Fail data/app.log sobib hästi väikese logianalüüsi jaoks.


cut -d ' ' -f 2 data/app.log | sort | uniq -c | sort -nr

Siin:

  • cut -d ' ' -f 2 võtab välja logitaseme
  • sort | uniq -c loendab tasemed kokku
  • tulemuseks saad näiteks INFO, WARN, ERROR sagedused

See on hea näide, sest siin kohtuvad tekstifilter, väljavõte ja koondamine.

Päris näide: palju ridu ja palju sõnu

Kui tahad kiiresti aru saada, kui suur üks tekstifail on:


wc -l data/sample-text.txt
wc -w data/sample-text.txt

See annab kaks eri mõõdet:

  • mitu rida
  • mitu sõna

Mõlemad on praktilised, aga nad ei tähenda sama asja.

Päris näide: join

join võib alguses tunduda abstraktne, kuid sobib hästi väikeste tabelite ühendamiseks.


printf '1 Tallinn\n2 Tartu\n3 Narva\n' > linnad.txt
printf '1 Harjumaa\n2 Tartumaa\n3 Ida-Virumaa\n' > maakonnad.txt
join linnad.txt maakonnad.txt

Siin:

  • mõlemal failil on esimene väli ühine võti
  • join ühendab sama võtmega read kokku

Oluline detail:

  • sisendfailid peavad tavaliselt võtme järgi sorditud olema

Päris näide: pr

Kui tahad kiirelt sõnaloendit veergudesse panna:


head -n 20 data/sample-words.txt | pr -4 -t

Siin:

  • -4 teeb neli veergu
  • -t jätab päise ja jaluse ära

pr ei ole tänapäeval kõige sagedasem tööriist, kuid sobib kiireks veergudesse vormindamiseks.

Näiteks saab nummerdatud loendi panna mitmesse veergu:


seq -w 0 99 | pr -5 -t

Siin:

  • seq -w 0 99 teeb loendi 00 kuni 99
  • pr -5 -t jagab selle viide veergu

Kui tahad suurema hulga numbreid panna ühele pr loogilisele lehele, siis saab mängida lehepikkusega:


seq -w 0 9999 | pr -8 -t -l 1250

Selle loogika on:

  • seq -w 0 9999 teeb numbrid 0000 kuni 9999
  • -8 teeb kaheksa veergu
  • -t eemaldab päise ja jaluse
  • -l 1250 ütleb, et ühe pr lehe kõrgus on 1250 rida

Oluline täpsustus:

  • see tähendab „üks käsu pr leht“
  • see ei tähenda automaatselt üht füüsilist A4-paberilehte

Päris printimisel sõltub tulemus veel fontidest, paberi suurusest ja sellest, kas prindid terminalist, PDF-ist või mõnest muust keskkonnast.

Kui tahad lihtsalt rahulikult mitut veergu eelvaadata, siis väiksem näide on tavaliselt parem:


seq -w 0 199 | pr -8 -t | less

Lokaat ja sortimine

sort ei tööta alati kõigis keskkondades täpselt ühtemoodi, sest tulemus sõltub ka keele- ja piirkonnasätetest (locale).

See on eriti nähtav täpitähtede puhul.

Näide:


printf 'Õun\nÄmber\nÖö\nUdu\n' > tahed.txt
sort tahed.txt
LC_ALL=C sort tahed.txt

Siin võib juhtuda, et:

  • tavaline sort kasutab sinu keskkonna keele- ja piirkonnasätteid
  • LC_ALL=C sort ... sorteerib lihtsama baitide loogika järgi

See tähendab, et sort tulemus ei ole alati "absoluutne tõde", vaid sõltub keskkonnast.

Kui töötled eestikeelset teksti, siis tasub seda meeles pidada.

wc -l loendab täpselt reavahetusi, mitte visuaalseid ridu. Kui faili viimane tekstirida ei lõpe reavahetusega, jääb see selle loenduse alt välja. uniq võrdleb alati kõrvutisi ridu; kogu faili korduste koondamiseks tuleb samad read eelnevalt kõrvuti tuua, tavaliselt sort-iga.

Minitest

  1. Loenda faili read.
  2. Sorteeri sõnaloend tähestiku järgi.
  3. Loenda, mitu korda iga sõna esineb.
  4. Proovi join abil ühendada kaks väikest faili ühise esimese välja järgi.
  5. Tee data/app.log failist logitasemete sagedustabel.

Peatüki täisspikker

Töövood

Eesmärk

tüüpiline töövoog on: sorteeri read, koonda kordused ja loe tulemused kokku

Põhikujud

  • sort viljad.txtsordi read
  • sort viljad.txt | uniqeemalda kordused
  • sort viljad.txt | uniq -cloe kordused
  • wc -l data/sample-text.txtloe read
  • wc -w data/sample-text.txtloe sõnad
  • join nimed.txt linnad.txtühenda võtme järgi
  • prjaga veergudeks

Olulisemad lipud, märgid ja kiirnupud

  • sort -nnumbrid
  • sort -rtagurpidi
  • uniq -cloenda kordused
  • wc -lridade arv
  • wc -wsõnade arv
  • pr -2kaks veergu

sed, awk ja perl praktiliselt

sed sobib asendamiseks, awk väljade ja arvutuste jaoks ning perl keerukamaks mustritöötluseks.

Kiirülevaade

Eesmärk on minna edasi siis, kui grep, cut ja tr enam ei piisa: muuta ridu, arvutada väljade kaupa ja kirjutada lühike tekstiloogika.

KäskMilleksMida tavaliselt näed
sedmuuda ridu mustri järgiümber kujundatud tekstivoog
awktöötle välju ja veergevalitud või arvutatud väljad
perltee keerukam mustri- ja tekstiloogikaskripti või üherealise käsu väljund
faili muutminenõuab eraldi kujusisendfail ei muutu vaikimisi
süntaksivigakäsk ei käivitu ootuspäraseltmustri- või süntaksiveateade

Tüüpilised algaja vead

  • oodatakse, et sed või awk muudab faili kohe kohapeal
  • aetakse segi „esimene vaste real“ ja „kõik vasted real“
  • kirjutatakse üherealine käsk, mille loogika on endalegi liiga segane

Üks asendus ja kõik asendused

sed 's/vana/uus/' asendab iga rea esimese vaste; lõppu lisatud g asendab kõik vasted sellel real. Sisendfail ei muutu: tulemus läheb standardväljundisse.


echo 'kass koer kass' | sed 's/kass/rebane/'
echo 'kass koer kass' | sed 's/kass/rebane/g'
Terminali näide, kus fail `tere.txt` kopeeritakse failiks `kere.txt`, seejärel tehakse käsuga `sed 's/vana/uus/'` uus fail `mere.txt`, ja `head *` abil võrreldakse kõigi kolme faili algust.
Terminali näide, kus fail tere.txt kopeeritakse failiks kere.txt, seejärel tehakse käsuga sed 's/vana/uus/' uus fail mere.txt, ja head * abil võrreldakse kõigi kolme faili algust.

Selle pildi loogika on järgmine:

  1. echo "Tere tere vana kere" > tere.txt loob algse faili
  2. cp tere.txt kere.txt teeb samast sisust koopia
  3. sed 's/vana/uus/' tere.txt > mere.txt loeb faili tere.txt, asendab esimese vaste ja kirjutab tulemuse uude faili
  4. head * näitab kolme faili algust üksteise järel

Ära suuna tulemust sisendfaili endasse: sed 's/vana/uus/' fail > fail tühjendab faili enne lugemist. Vali uus väljundfail. Kohapealse muutmise sed -i kuju erineb GNU ja macOS-i versioonis; kontrolli kohalikku käsiraamatut.

Üks asendus või kõik asendused

sed-i üks kõige tähtsamaid erinevusi on see, kas tehakse üks asendus või kõik asendused real.

Terminali näide, kus failis `tere.1.txt` tehakse kõigepealt käsk `sed 's/ere/ERE/'`, mis muudab ainult esimese vaste, ja seejärel `sed 's/ere/ERE/g'`, mis muudab kõik vasted.
Terminali näide, kus failis tere.1.txt tehakse kõigepealt käsk sed 's/ere/ERE/', mis muudab ainult esimese vaste, ja seejärel sed 's/ere/ERE/g', mis muudab kõik vasted.

Selle pildi sees on näha kaks väga erinevat tulemust:

  1. sed 's/ere/ERE/' tere.1.txt > tere.2.txt muudab ainult rea esimese vaste
  2. sed 's/ere/ERE/g' tere.1.txt > tere.3.txt muudab kõik vasted samal real
  3. head * näitab pärast kõiki kolme faili üksteise järel, nii et vahe on kohe nähtav

Rusikareegel on lihtne:

  • ilma g-ta muudetakse tavaliselt ainult esimene vaste real
  • g tähendab global, ehk kõik vasted sellel real

awk -F: valib väljade eraldajaks kooloni. $1 ja $2 tähistavad esimest ja teist välja; komaga eraldatud väljad prinditakse vaikimisi tühikuga.


printf 'Mari:20\nJaan:21\n' | awk -F: '{print $1}'
printf 'Mari:20\nJaan:21\n' | awk -F: '{print $1, $2}'

Perli -e võtab koodi käsurealt, -p loeb ja väljastab read automaatselt ning -n jätab väljastamise sinu koodi otsustada. -F: määrab eraldaja, -a jagab rea massiivi @F, -l haldab reavahetusi; $F[0] on esimene väli.


echo 'kass koer kass' | perl -pe 's/kass/rebane/g'
printf 'Mari\nJaan\n' | perl -ne 'print if /Ja/'
printf 'Mari:20\nJaan:21\n' | perl -F: -lane 'print $F[0]'

Edasijõudnule: algarvud regulaaravaldisega

Järgmine näide ei ole algarvude leidmiseks kõige praktilisem, kuid näitab hästi, kui võimsad võivad Perli üherealised käsud olla:


seq 2 200 | perl -nlE 'say if ("a" x $_) !~ /^(aa+)\1+$/'

See kuju on siin meelega võimalikult lihtne. Kuna alustame vahemikku 2-st, ei pea me eraldi 0 ja 1 juhtumeid regexis välja filtreerima.

Mõte on selline:

  • iga arv teisendatakse ajutiselt ühe tähe korduseks, näiteks 7 muutub kujule aaaaaaa
  • regex proovib leida, kas see rida koosneb mingist väiksemast plokist, mida saab mitu korda korrata
  • kui saab, siis arv ei ole algarv
  • kui ei saa, siis prinditakse arv välja

See tähendab sisuliselt: „Prindi ainult need arvud, mida ei saa kirjutada kujul m * n, kus mõlemad on suuremad kui 1.“

Praktilises skriptis oleks tavaliselt mõistlikum kasutada tavapärast jaguvuskontrolli, aga ühe rea triki või loengu-näite jaoks on see väga meeldejääv.

Minitest

  1. Asenda reas üks sõna teisega.
  2. Võta välja kooloniga eraldatud faili esimene väli.
  3. Prindi awk abil ainult teine veerg.
  4. Filtreeri perl -ne abil välja ainult need read, kus on kindel muster.
  5. Tee perl -pe abil globaalne asendus kogu sisendi ulatuses.

Peatüki täisspikker

Töövood

Eesmärk

kasuta sed lihtsaks asenduseks, awk väljade jaoks ja perl siis, kui vajad tugevamat regulaaravaldiste loogikat

Põhikujud

  • echo 'kass koer kass' | sed 's/kass/rebane/'asenda esimene
  • echo 'kass koer kass' | sed 's/kass/rebane/g'asenda kõik
  • printf 'Mari:20\nJaan:21\n' | awk -F: '{print $1}'võta esimene väli
  • printf 'Mari:20\nJaan:21\n' | awk -F: '{print $1, $2}'võta kaks välja
  • echo 'kass koer kass' | perl -pe 's/kass/rebane/g'asenda Perliga
  • printf 'Mari\nJaan\n' | perl -ne 'print if /Ja/'filtreeri Perliga

Olulisemad lipud, märgid ja kiirnupud

  • s/vana/uus/üks asendus
  • /gkõik vasted
  • -F:koolon väljade vahel
  • $1esimene väli
  • $2teine väli
  • -pe / -neread läbi

find ja xargs ohutumalt

Loogika

find leiab teed.

xargs annab need teed järgmisele käsule edasi.

Probleem tekib siis, kui failinimedes on:

  • tühikud
  • tabulaatorid
  • reavahetused

Kui kasutada naiivset kuju, siis võib üks failinimi laguneda mitmeks tükiks. Sellepärast on oluline paar:

  • find ... -print0
  • xargs -0

Kiirülevaade

Eesmärk on failipuus tegutseda nii, et tühikud ja muud keerulised failinimed tulemust ei lõhuks.

Käsk või kujuMilleksMida tavaliselt näed
find ...leia kirjeid tingimuste järgileitud failide ja kataloogide teed
xargsanna teed järgmisele käsulejärgmise käsu väljund
-print0eralda nimed nullmärgigamasinloetav voog, mitte tavalised read
xargs -0loe nullmärgiga nimesidtühikutega nimed jäävad terveks
-exec ... {} +käivita käsk otse find seesjärgmise käsu väljund

Vale eraldusviis lõpeb sageli veateatega No such file or directory, sest failinimi lõigatakse tükkideks.

Tüüpilised algaja vead

  • eeldatakse, et kõik failinimed on lihtsad ühe sõnaga nimed
  • kasutatakse xargs-it pimesi seal, kus -exec oleks lihtsam
  • testimata käsk pannakse kohe muutma või kustutama

Käivita need käsud


find . -type f -name '*.txt'
find . -type f -name '*.txt' -print0 | xargs -0 wc -l
find . -type f -name '*.log' -exec ls -lh {} +

Kui tahad näha just keeruliste nimede loogikat, tee väike näide:


mkdir -p find-naide
cd find-naide
touch 'üks fail.txt' 'teine fail.txt'
find . -type f -name '*.txt' -print0 | xargs -0 ls -l

Miks -print0 ja -0 tähtsad on

Vaikimisi eraldatakse käsurea tekst sageli tühikute ja reavahetuste järgi. See tähendab, et fail nimega:


minu fail.txt

võib naiivses töövoos käituda nagu kaks eri sõna.

Selle vältimiseks:

  • find -print0 eraldab tulemused nullmärgiga
  • xargs -0 loeb just seda vormi

See on praktiline „ohutu vaikevariant“, kui liigud käsult find järgmise käsuni.

xargs või -exec?

Mõlemad on kasulikud.

Näide xargs-iga:


find . -type f -name '*.txt' -print0 | xargs -0 wc -l

Näide -exec-iga:


find . -type f -name '*.txt' -exec wc -l {} +

Rusikareegel:

  • kui tahad lihtsat ja ohutut kuju, siis -exec ... + on sageli väga hea
  • kui tahad teadlikult ehitada torupõhist töövoogu, siis -print0 | xargs -0 on tugev valik

xargs vs while read

On veel üks väga kasulik kuju:


find data -type f -name '*.txt' -print0 |
while IFS= read -r -d '' fail; do
  wc -l "$fail"
done

Selle loogika on:

  • find -print0 annab failinimed ohutult edasi
  • read -r -d '' loeb ühe nullmärgiga eraldatud faili korraga
  • tsüklis saad iga faili kohta teha rohkem kui ühe sammu

xargs on väga hea siis, kui:

  • tahad ühe käsu kiiresti paljudele failidele anda

while read on eriti hea siis, kui:

  • tahad iga faili kohta teha väikese loogika
  • vajad tsüklit, tingimust või mitut käsku järjest

Näiteks:


find data -type f -name '*.txt' -print0 |
while IFS= read -r -d '' fail; do
  echo "Töötlen: $fail"
  head -n 1 "$fail"
done

Väldi pimesi hävitavaid käske

find ja xargs lähevad eriti ohtlikuks siis, kui lõppu pannakse:

  • rm
  • chmod
  • mv

Seetõttu tasub alati alustada ohutu eelvaatega:


find . -type f -name '*.log'

ja alles siis lisada lõppu faile muutev tegevus.

Veel parem on alustada mittehävitava käsuga, näiteks:


find . -type f -name '*.log' -print0 | xargs -0 ls -lh

Päris näide: loenda kõik data/ tekstifailid kokku

Repo kataloog data/ on turvaline koht find-i harjutamiseks.


find data -type f -name '*.txt' -print0 | xargs -0 wc -l

Siin:

  • find leiab kõik .txt failid
  • -print0 eraldab need ohutult
  • xargs -0 wc -l annab igale failile reaarvu

See on hea näide, sest siin ei ole vaja midagi kustutada ega muuta, ainult vaadata.

Päris näide: keeruliste nimedega failid

Kui tahad näha, miks -print0 ja -0 on päriselt vajalikud, tee selline väike töökaust:


mkdir -p otsi-naide/'Tallinn andmed'
cp data/sample-words.txt 'otsi-naide/Tallinn andmed/sonad 1.txt'
cp data/sample-text.txt 'otsi-naide/Tallinn andmed/tekst 2.txt'
find otsi-naide -type f -name '*.txt' -print0 | xargs -0 ls -lh

Selle töövoo mõte on:

  • failinimedes on tühikud
  • naiivne xargs võiks need lõhkuda
  • -print0 | xargs -0 hoiab need tervikuna koos

Päris näide: leia logifail ja vaata selle suurust


find data -type f -name '*.log' -exec ls -lh {} +

See on väike, aga päris praktiline muster:

  • leia failid
  • ära hävita midagi
  • vaata enne suurust või arvu

Just nii peakski find-iga töötamine algama.

Tühi tulemus ja suured failihulgad. find ... -exec käsk {} + ei käivita käsku, kui vasteid pole. xargs -0 korral sõltub tühja sisendi käitumine süsteemist; GNU xargs võib käsu siiski käivitada. GNU valik -r väldib seda, kuid pole igal pool sama tähendusega. Suure hulga korral võib nii -exec ... + kui ka xargs jagada failid mitmeks käivituseks: näiteks wc kokkuvõte on siis partii, mitte tingimata kogu puu summa.

read -r -d '' näide eeldab Bashi või zsh-d, mitte suvalist POSIX sh-d. IFS= säilitab nime alguse ja lõpu tühikud, -r kurakriipsud ning tühi -d määrab nullmärgi eraldajaks.

Minitest

  1. Loo vähemalt üks fail, mille nimes on tühik.
  2. Leia see fail find-iga.
  3. Näita seda faili ls -l abil läbi töövoo -print0 | xargs -0.
  4. Seleta ühe lausega, miks -print0 ja -0 koos käivad.
  5. Loenda kataloogi data/ tekstifailide read käsuga find ... -print0 | xargs -0 wc -l.
  6. Tee sama töövoog uuesti kujul while IFS= read -r -d '' fail; do ...; done.

Peatüki täisspikker

Töövood

Eesmärk

otsi failid find-iga ja anna need ohutult edasi järgmisele käsule, isegi siis, kui nimedes on tühikuid

Põhikujud

  • find . -type f -name '*.txt'otsi failid
  • find . -type f -name '*.txt' -print0 | xargs -0 wc -lloe read ohutult
  • find . -type f -name '*.log' -exec ls -lh {} +käivita otse
  • find data -type f -name '*.txt' -print0 | while IFS= read -r -d '' fail; do head -n 1 "$fail"; donetöötle ükshaaval

Olulisemad lipud, märgid ja kiirnupud

  • -type ffind: ainult tavafailid
  • -name '*.txt'nime järgi
  • -print0find: failinimede vahel nullmärk
  • xargs -0xargs: eralda argumendid nullmärgiga
  • -exec käsk {} +käivita otse
  • read -r -d ''Bash/zsh: loe nullmärgini, säilita kaldkriipsud

Esimene shelliskript

Shelliskript on käske sisaldav tekstifail. Teeme ühe skripti, mis tervitab kõiki käsurealt antud nimesid ja teatab veast, kui ühtegi nime ei antud.

Kuidas skript käivitub

Esimene rida ehk shebang, näiteks #!/usr/bin/env bash, määrab tõlgendaja faili otse käivitamisel. env otsib Bashi PATH-ist. Käivitusõigus ja tõlgendaja valik on eri asjad:

KujuMis juhtub
bash tervita.sh MariBash loeb faili; käivitusõigust pole vaja
chmod u+x tervita.sh, seejärel ./tervita.sh Marifail käivitub shebang-rea järgi
sh tervita.sh Marivalitakse sh, isegi kui shebang nimetab Bashi
bash -n tervita.shkontrollitakse süntaksit, käske ei käivitata

sh ei pruugi toetada Bashi erisusi, näiteks massiive ja [[ ... ]] tingimust. Süntaksikontroll ei ole ohutuskontroll: korrektne skript võib siiski teha soovimatuid muudatusi. Ka hilisem süntaksiviga ei taga, et varasemad käsud pole jõudnud käivituda.

Argumendid, tingimus ja kordus

Enne terviknäidet selle ehitusklotsid:

KirjapiltTähendus
$0skripti käivitamisel kasutatud nimi, mitte jooksva shelli nimi
$#argumentide arv
$1esimene argument
"$@"kõik argumendid eraldi, säilitades tühikud nende sees
[ "$#" -eq 0 ]kontroll: kas argumentide arv on null; sulgude ümber on tühikud
if ...; then ...; fitingimuse õnnestumisel käivitatav haru
for nimi in "$@"; do ...; donekorda tegevust iga argumendiga
>&2suuna teade veaväljundisse
exit 1 / exit 0lõpeta veaga / edukalt

Loo fail

Tööta eraldi kataloogis. Here-doc <<'EOF' annab järgmised read käsu sisendiks kuni eraldi real oleva EOF-ini. Jutumärgid takistavad muutujate laiendamist faili loomise ajal; need peavad laienema alles skripti käivitamisel. > kirjutab olemasoleva tervita.sh üle.


mkdir -p ~/tmp/skripti-naide
cd ~/tmp/skripti-naide
cat > tervita.sh <<'EOF'
#!/usr/bin/env bash
if [ "$#" -eq 0 ]; then
  printf 'Kasuta: %s nimi...\n' "$0" >&2
  exit 1
fi
for nimi in "$@"; do
  printf 'Tere, %s!\n' "$nimi"
done
exit 0
EOF

printf asendab %s järgmise argumendi tekstiga ning \n lõpetab rea.

Proovi edu ja viga

Kontrolli süntaksit. Vaikse eduka kontrolli järel anna omanikule käivitusõigus:


bash -n tervita.sh
chmod u+x tervita.sh
./tervita.sh Mari 'Jaan Tamm'

Tulemus on kaks tervitust, mitte kolm:


Tere, Mari!
Tere, Jaan Tamm!

Proovi ka puuduvat sisendit:


./tervita.sh
echo $?

Näed kasutusjuhist ja arvu 1. $? sisaldab vahetult eelmise käsu lõpetuskoodi: mõni vahele käivitatud käsk asendaks selle oma tulemusega.

Shebang töötab ka teiste keeltega: #!/usr/bin/env python3 valib Pythoni, kuid faili sisu peab siis olema Pythoni kood. Selline fail on Pythoni skript, mitte shelliskript. Pikem võrdlus on kompileerimise ja käivitamise peatükis.

Minitest

  1. Käivita skript ühe, kolme ja null argumendiga. Kontrolli iga kord lõpetuskoodi.
  2. Anna nimeks 'Mari Maasikas'. Miks on jutumärgid vajalikud nii käsureal kui skripti "$@" ümber?
  3. Lisa skripti enne tsüklit rida, mis kuvab argumentide arvu. Testi süntaksit enne käivitamist.
  4. Muuda veajuhist nii, et kasutaja näeks üht korrektset käivitusnäidet. Veateade peab endiselt minema veaväljundisse.

Peatüki täisspikker

Töövood

Eesmärk

esimese shelliskripti tuum on viis asja: shebang, käivitatavus, argumendid, lihtne tingimus ja lõpetuskood

Põhikujud

  • chmod +x tervita.shtee käivitatavaks
  • ./tervita.sh Mari Jaankäivita argumentidega
  • ./tervita.shnäe veajuhtumit
  • echo $?vaata lõpetuskoodi
  • bash skript.shkäivita Bashiga
  • sh skript.shkäivita sh-ga
  • ./skript.shkasuta shebang-rida

Olulisemad lipud, märgid ja kiirnupud

  • #!/usr/bin/env bashvali Bash
  • $1esimene argument
  • "$@"kõik argumendid
  • if ... fitingimus
  • for ... donekordus
  • exit 0 / exit 1edu või viga

cron ja ajastatud tööd

Ajastatud töö käivitub kindlal ajal ilma sinu kohalolekuta. cron sobib näiteks perioodilise mõõtmise või varundusskripti käivitamiseks. Töö ei ava terminaliakent: salvesta väljund logisse.

Loe ajamustrit

Kasutaja cronitabeli reas on viis ajavälja ja seejärel käsk:


*/15 * * * * /bin/date >> "$HOME"/cron-naide.log 2>&1
Väli vasakultVäärtused ja näite tähendus
minut0–59; */15 tähendab siin minuteid 0, 15, 30 ja 45
tund0–23; * tähendab iga tundi
kuu päev1–31; * tähendab iga päeva
kuu1–12; * tähendab iga kuud
nädalapäev0–7, kus 0 ja 7 on pühapäev; * tähendab iga nädalapäeva

Seega ei tähenda näide „15 minutit pärast lisamist“, vaid järgmisi kellaaegu, mille minut jagub 15-ga. >> lisab väljundi logi lõppu ja 2>&1 ühendab sinna veaväljundi.

Kontrolli käsku enne ajastamist


/bin/date >> "$HOME"/cron-naide.log 2>&1
tail -n 5 "$HOME"/cron-naide.log

Logisse peab lisanduma praegune kuupäev ja kellaaeg. Croni PATH ja keskkond võivad erineda sinu terminali omadest; eelista programmi ning sisendfailide täisteid. Oma virtuaalkeskkonna Pythonit saab kutsuda otse selle täisteega, ilma interaktiivse aktiveerimiseta.

Lisa üks töö seniseid säilitades

crontab -l näitab olemasolevaid töid, crontab -e avab need redaktoris. Kui töid pole, võib loendi asemel tulla vastav teade.


crontab -l
crontab -e

Lisa ülaltoodud näidisrida seniste ridade lõppu, salvesta ning kontrolli uuesti crontab -l abil. Kui tahad ainult mustrit õppida, ära rida päriselt paigalda.

> crontab fail asendab kogu senise kasutaja cronitabeli, mitte ei lisa failist üht rida. Samuti eemaldab crontab -r kogu tabeli. Katse lõpetamiseks ava crontab -e ja eemalda ainult enda lisatud näidisrida.

Kui logisse ei teki uut rida

Kontrolli, kas määratud kellaaeg saabus, masin oli sisse lülitatud, croniteenus töötas ja kasutajal oli logifailile kirjutamisõigus. Tavapärane cron ei käivita magamise või väljalülitamise ajal vahele jäänud tööd automaatselt tagantjärele.

Linuxis kasutatakse ka systemd ajasteid, macOS-is launchd-d. Süsteemi ajavöönd ja suveajale üleminek mõjutavad kellaaegadel põhinevaid ajastusi. Lisaks käsitleb cron käsureas märki % eriliselt; näiteks date +%F vajab cronireas kuju date +\%F.

Minitest

  1. Mida tähendavad ajad 0 8 * * * ja */15 * * * *?
  2. Katseta logisse kirjutavat käsku käsitsi, ajastust lisamata.
  3. Kuidas eemaldada ainult oma katsetöö, jättes teised alles?
  4. Miks terminalis töötav käsk ei pruugi cronis sama tulemuse anda?

Peatüki täisspikker

Töövood

Eesmärk

Ajasta läbiproovitud käsk; kasuta täisteid ja talleta väljund logisse.

Käsud ja näited

  • crontab -lvaata praeguse kasutaja ajastusi
  • crontab -emuuda tabelit, säilitades muud tööd
  • /bin/date >> "$HOME"/cron-naide.log 2>&1testi ajastatavat käsku käsitsi
  • tail -n 5 "$HOME"/cron-naide.logkontrolli, kas töö lisab kirjeid

Märgid ja valikud

  • */15 * * * *minutitel 0, 15, 30 ja 45
  • 0 8 * * 1-5tööpäeviti kell 08.00 süsteemi ajavööndis
  • crontab failasendab kogu kasutaja ajastustabeli
  • crontab -reemaldab kogu kasutaja ajastustabeli

Git, GitHub ja töövoog

Loogika

Git ei ole lihtsalt viis faile GitHubi saata. Git hoiab projekti muutuste ajalugu.

Git nimetab üht loogilist ajalookirjet sõnaga commit; selles peatükis kasutame selle kohta ka eestikeelset sõna versioonikirje.

Kõige tähtsam töövoog on:

  1. vaata, mis seisus repo on
  2. vaata, mis täpselt muutus
  3. vali järgmise versioonikirje sisu
  4. salvesta loogiline muutus versioonikirjena
  5. sünkrooni vajadusel kaugrepoga

Git ja GitHub ei ole sama asi:

  • Git on versioonihaldus sinu masinas
  • GitHub on teenus, kus repot jagada, arutada ja üle vaadata

Kiirülevaade

KäskMilleksMida tavaliselt näed
git statusvaata repo seisumuutunud, vahealal olevad ja jälgimata failid
git diffvaata tööpuu muutusi- ja + read jälgitud failides
git add failpane fail vahealaleedukal juhul sageli vaikne
git diff --cachedvaata vaheala sisujärgmisse versioonikirjesse minevad muudatused
git commit -m '...'loo versioonikirjeuue kirje lühikood ja kokkuvõte
git log --onelinevaata ajaluguversioonikirjed ühe rea kaupa
git restore faileemalda tööpuu muudatusfail taastatakse vaheala seisu; salvestamata tööpuumuudatus kaob
git restore --staged faileemalda fail vahealaltsisu jääb alles, vaheala muutub
git switch -c haruloo ja ava uus haruliigud uuele harule
git pull --ff-onlyuuenda puhas haru serveristedasinihe (fast-forward) või selge keeldumine
git push -u origin harusaada haru GitHubiüleslaadimise kokkuvõte

Tüüpilised algaja vead

  • tehakse git add enne, kui muudatus on üle vaadatud
  • arvatakse, et git diff näitab ka täiesti uusi ehk jälgimata faile
  • aetakse segi tööpuu, vaheala ja versioonikirje
  • tehakse git pull määrdunud tööpuuga
  • töötatakse otse main harus, kuigi muudatus võiks olla eraldi harus
  • kasutatakse git push --force ilma aru saamata, kelle ajalugu see muudab

Kolm olekut: tööpuu, vaheala ja versioonikirje

Giti õppimine läheb palju lihtsamaks, kui eristad kolme kohta.

KohtTähendusKontrollkäsk
tööpuusinu failid praegu kettalgit status, git diff
vahealajärgmise versioonikirje ettevalmistusgit diff --cached
versioonikirje (commit)salvestatud loogiline muutusgit log --oneline

Tavaline rütm on:


git status
git diff
git add fail.txt
git diff --cached
git commit -m 'Selge sõnum'

git add ei tähenda veel „saada GitHubi“. See tähendab ainult, et muudatus läheb järgmisse versioonikirjesse.

Esimene harjutusrepo

Harjutamiseks vali uus tühi kataloog, mitte olemasolev repo. Näite git init -b main loob hoidla põhiharuga main; -b määrab algse haru nime.


mkdir -p ~/tmp/git-naide
cd ~/tmp/git-naide
git init -b main
printf 'esimene rida\n' > naide.txt
git status
git add naide.txt
git diff --cached
git commit -m 'Lisa naidefail'
git log --oneline

Pane tähele: uus fail naide.txt on alguses jälgimata. Seetõttu ei näita tavaline git diff veel selle sisu. Pärast git add naide.txt näitab git diff --cached, mis läheb esimesse versioonikirjesse.

Kui git commit kaebab autori identiteedi üle, seadista nimi ja e-post:


git config user.name "Eesnimi Perenimi"
git config user.email "nimi@example.com"

Need seaded kehtivad selles repos; --global muudaks vaikeseadet kõigis sinu repodes. Nimi ja e-post salvestatakse versioonikirjetesse ning avaliku repo puhul muutuvad avalikuks. See ei ole GitHubi sisselogimine. Seejärel proovi git commit uuesti.

Muudatuse ülevaatamine

Kui fail on juba Gitis jälgimisel, näitab git diff tööpuu muutust.


printf 'teine rida\n' >> naide.txt
git status
git diff

Diffi lugemise algreegel:

  • - tähendab eemaldatud rida
  • + tähendab lisatud rida
  • ülejäänud read on ümbrus ehk kontekst

Enne käsku git commit kontrolli ka vaheala:


git add naide.txt
git diff --cached
git commit -m 'Lisa teine rida'

Hea harjumus:

  • enne git add: git diff
  • enne git commit: git diff --cached
  • enne tõmbekutse (pull request) avamist: vaata kogu muudatus veel kord üle

Igapäevane põhivoog

Kui repo on juba olemas ja töötad GitHubiga, on rahulik põhivoog selline:


git status
git switch main
git pull --ff-only
git switch -c parandus

Kui sinu repo põhiharu nimi on master, kasuta nendes näidetes main asemel master.

Seejärel tee muudatused. Enne versioonikirje loomist:


git status
git diff
git add fail1 fail2
git diff --cached
git commit -m 'Paranda näited Git peatükis'
git push -u origin parandus

Miks just nii:

  • git status näitab, kas tööpuu on puhas
  • git pull --ff-only uuendab põhiharu ainult siis, kui seda saab teha edasinihkena
  • git switch -c parandus hoiab muudatuse eraldi harus
  • git diff ja git diff --cached vähendavad juhusliku versioonikirje riski

Kui git pull --ff-only keeldub, ära lisa kohe keerulisemaid lippe. Tee esmalt git status ja vaata, kas sul on kohalikke versioonikirjeid või pooleliolevaid muudatusi.

Haru ehk branch

Haru (branch) on sama projekti eraldi arenguliin.

Tüüpiline mõtteviis:

  • main on põhirida
  • väike parandus tehakse eraldi harus
  • hiljem ühendatakse valmis haru tõmbekutse (pull request) kaudu põhiharuga

Põhikäsud:


git branch
git switch -c parandused-logides
git switch main
git branch -d parandused-logides

Siin:

  • git branch näitab harusid; tärn näitab praegust haru
  • git switch -c nimi loob uue haru ja liigub sinna
  • git switch main liigub olemasolevale harule
  • git branch -d nimi kustutab kohaliku haru, kui see on ühendatud

Vanemates juhendites näed sageli kuju:


git checkout -b parandus

See tähendab sama, mis git switch -c parandus, aga switch on algajale selgem: see ütleb otse, et vahetad haru.

Kaugrepo: clone, fetch, pull, push

Kaugrepo on sama repo serveris, näiteks GitHubis. Vaikimisi nimi on sageli origin.

Kui sul ei ole repot veel kohalikus masinas:


git clone git@github.com:kasutaja/projekt.git
cd projekt
git status

See kuju kasutab SSH-d. Kui SSH-võtmed ei ole veel seadistatud, pakub GitHub sama repo jaoks ka algusega https://... kloonimisaadressi.

Kui tahad ainult teada saada, mis serveris muutus, kasuta:


git fetch origin
git log --oneline --graph --decorate --all -n 20

git fetch uuendab infot kaugrepo kohta, aga ei muuda sinu praegust tööharu.

Kui tahad puhta kohaliku haru serveriga samasse seisu tuua:


git pull --ff-only

Kui sul on oma haru valmis ja tahad selle GitHubi saata:


git push -u origin parandus

Kui tööpuu pole puhas

Enne haru vahetamist ning käskude pull või rebase kasutamist kontrolli:


git status

Järgmine käsk kustutab faili tööpuus tehtud, vahealale lisamata muudatused. git restore fail.txt taastab faili vahealalt, mitte tingimata viimasest versioonikirjest. Vaata enne git diff ja jäta vajalik töö alles:


git restore fail.txt

Kui tahad faili vahealalt eemaldada, kuid sisu alles jätta:


git restore --staged fail.txt

Kui tahad poolelioleva töö korraks kõrvale panna:


git stash push -m 'pooleli enne pulli'
git pull --ff-only
git stash pop

Vaikimisi jätab stash jälgimata failid kõrvale; nende kaasamiseks on valik -u. stash pop võib tekitada konflikti ning jätab sel juhul kirje alles. stash on ajutine sahtel, mitte pikaajaline hoiukoht. Kui töö on sisuline, salvesta see pigem käsuga git commit, mitte ära jäta muudatusi nädalateks stash-i.

.gitignore

Kõiki faile ei tasu Giti lisada. Paroolid, privaatvõtmed ja kohalikud saladused ei kuulu ka privaatsesse reposse. Kui saladus on juba avaldatud, tuleb see tühistada või vahetada; failist kustutamine ei eemalda seda ajaloost.

Tüüpiliselt jäetakse välja:

  • virtuaalkeskkonnad, näiteks .venv/
  • vahemälud, näiteks __pycache__/
  • koostamisväljundid, näiteks dist/
  • ajutised logid, näiteks *.log

Lihtne näide:


cat > .gitignore <<'EOF'
.venv/
__pycache__/
dist/
*.log
.env
EOF
git status

Kui fail on juba Giti lisatud, siis ainult .gitignore ei eemalda seda automaatselt repost. .gitignore takistab eelkõige uute sobivate failide juhuslikku lisamist.

merge ja rebase

merge ja rebase panevad kaks ajalugu uuesti kokku, aga teevad seda eri moodi.

TegevusMõteMillal kasutada
mergesäilitab mõlema haru ajaloovalmis haru ühendamisel
rebasetõstab sinu versioonikirjed teise haru lõppuoma parandusharu korrastamisel

Näide: oled harus parandus ja tahad sellesse ühendada värske haru main:


git fetch origin
git switch parandus
git rebase origin/main

Näide: tahad valmis haru main sisse ühendada:


git switch main
git pull --ff-only
git merge parandus

Meeskonnareegel:

  • oma parandusharus võib enne tõmbekutse esitamist sageli kasutada käsku rebase
  • ära kasuta käsku rebase harus, millele teised juba oma tööd rajavad, kui see ei ole kokku lepitud
  • ühise main haru ajalugu tuleb käsitleda eriti ettevaatlikult

Konfliktid

Konflikt tekib siis, kui Git ei oska kahte muudatust ise kokku panna.

Failis võib olla selline koht:


    <<<<<<< HEAD
minu praegune tekst
    =======
teisest harust tulnud tekst
    >>>>>>> origin/main

See tähendab:

  • <<<<<<< HEAD all on sinu praeguse haru versioon
  • ======= eraldab kaks varianti
  • >>>>>>> origin/main all on teise haru versioon

Konfliktimärgid algavad päris failis rea algusest. Ülal on ühendamise (merge) näide. Ümbertõstmise (rebase) ajal võib HEAD tähistada hoopis alust, mille peale sinu versioonikirjet uuesti rakendatakse: loe mõlemat varianti, mitte ära vali neid sildi „minu“ järgi.

Lahendamine:

  1. ava fail redaktoris
  2. tee valmis õige lõpptekst
  3. kustuta konfliktimärgid
  4. kontrolli faili sisu
  5. lisa fail vahealale

Näiteks:


git status
nano fail.txt
git add fail.txt

Kui konflikt tekkis käsu git merge ajal:


git commit

Kui konflikt tekkis käsu git rebase ajal:


git rebase --continue

Kui läksid valesse suunda, katkesta ainult käimasolev tegevus:


git merge --abort
git rebase --abort

Kasuta neist ainult seda käsku, mis vastab parasjagu käimasolevale tegevusele.

Mida mitte teha pimesi

Need käsud võivad olla õiged, aga neid ei tasu kasutada paanikas:

  • git reset --hard
  • git clean -fd
  • git push --force
  • git branch -D haru

Rahulikum kontrolljärjekord on:

  1. git status
  2. git diff
  3. git diff --cached
  4. vajadusel küsi abi või tee koopia enne hävitavat käsku

Kui force-push on tõesti vajalik, peaks see olema meeskonnas kokku lepitud ja piirduma tavaliselt oma parandusharuga, mitte ühise haruga main.

GitHub: issue ja pull request

GitHubis seotakse muudatus tavaliselt arutelukoha või ülesandega.

Põhimõisted:

  • issue ehk probleemikirje on ülesanne, viga või aruteluteema
  • pull request ehk tõmbekutse esitab muudatusettepaneku ülevaatamiseks ja ühendamiseks
  • review ehk koodiülevaatus on teiste tagasiside tõmbekutse kohta
  • checklist ehk kontroll-loend on Markdowni märkeruutudega loend

Lihtne probleemikirje kirjeldus:


## Probleem

Peatükis 09 on `cat` ja `less` vahe liiga uduselt seletatud.

## Oodatud tulemus

Lugeja saab aru, millal kasutada `cat` ja millal `less`.

## Kontroll

- [ ] näide on peatükis parandatud
- [ ] koostamine õnnestub

Hea tõmbekutse ehk muudatusettepanek vastab kolmele küsimusele:

  • mis probleem lahendati
  • kuidas seda lahendati
  • kuidas kontrolliti, et lahendus töötab

Tüüpiline GitHubi töövoog:

  1. vali probleemikirje või kirjuta probleem lühidalt lahti
  2. loo selle jaoks haru, näiteks fix-cat-less
  3. tee väike loogiline muudatus
  4. loo selge sõnumiga versioonikirje
  5. saada haru käsuga git push GitHubi
  6. ava tõmbekutse (pull request)
  7. vasta ülevaatuskommentaaridele uute versioonikirjetega
  8. pärast ühendamist kustuta tööharu

Versioonikirje või tõmbekutse kirjelduses saab probleemikirjele viidata:


Fixes #12
Closes #12
Refs #12

Väike lõppharjutus

Tee ajutises repos üks väike töövoog läbi:


cd ~/tmp/git-naide
git switch -c kolmas-rida
printf 'kolmas rida\n' >> naide.txt
git diff
git add naide.txt
git diff --cached
git commit -m 'Lisa kolmas rida'
git log --oneline --graph --decorate -n 5

Kui tahad harjutusrepo hiljem lihtsalt ära unustada, jäta see ~/tmp alla või kustuta siis, kui oled kindel, et seal pole vajalikku tööd.

Spikker

Git-käskude visuaalne kaart ja pikem tekstiline meelespea on lisas Lisa B: spikrite register.

Minitest

  1. Selgita, mis vahe on tööpuul, vahealal ja commit-kirjel ehk versioonikirjel.
  2. Miks ei näita git diff uue jälgimata faili sisu?
  3. Millal vaatad git diff --cached?
  4. Miks on git switch -c parandus algajale selgem kui git checkout -b parandus?
  5. Mis vahe on git fetch ja git pull --ff-only vahel?
  6. Millal kasutaksid git restore --staged fail.txt?
  7. Kirjuta tõmbekutse (pull request) lühikirjeldus kujul: probleem, lahendus, kontroll.

Lisalugemine

Selle teema usaldusväärsemad viited leiad lisast Lisa E: usaldusväärsed viited ja lisalugemine.

Peatüki täisspikker

Edasijõudnu

Eesmärk

Git hoiab muutuste ajalugu; erista tööpuud, vaheala ja versioonikirjet ning vaata muudatused enne üle.

Põhikujud

  • git statusvaata seis
  • git diffmuutused tööpuus
  • git diff --cachedmuutused vahealal
  • git add fail.txtlisa vahealale
  • git commit -m '...'loo versioonikirje
  • git switch -c parandusloo haru
  • git pull --ff-onlyuuenda puhtalt
  • git push -u origin parandussaada haru
  • git restore --staged fail.txteemalda vahealalt

Olulisemad lipud, märgid ja kiirnupud

  • HEADpraegune tipp
  • mainpõhirida
  • originkaugrepo
  • vahealajärgmise versioonikirje sisu

Pythoni venv ja eraldatud keskkonnad

venv hoiab projekti Pythoni paketid teistest projektidest eraldi. Kui üks projekt vajab paketi üht ja teine teist versiooni, ei pea need sama paigaldust jagama. Tavaliselt on igal projektil oma .venv kataloog.

Loo ja aktiveeri

Vaja on töötavat python3 käsku. python3 -m venv käivitab selle Pythoni mooduli venv; viimane argument on loodava keskkonna kataloog.


mkdir -p ~/tmp/python-naide
cd ~/tmp/python-naide
python3 -m venv .venv
source .venv/bin/activate

Loomine on tavaliselt vaikne. Aktiveerimine muudab praeguse shelli PATH-i, nii et python viitab nüüd projekti keskkonnale. Viipa võib ilmuda (.venv), kuid kontrolli tegelikku tõlgendajat:


python -c 'import sys; print(sys.executable)'
python -m pip --version

-c käivitab jutumärkides antud Pythoni koodi. Mõlemas väljundis peaks tee viitama projekti .venv-ile. See ei muuda teise avatud terminali ega IDE tõlgendajat automaatselt.

Paigalda ja katseta paketti

python -m pip kasutab just selle Pythoni paketihaldurit. Järgmine käsk laeb paketi ja selle sõltuvused internetist:


python -m pip install requests
python -c 'import requests; print(requests.__version__)'

Teine käsk kinnitab, et pakett on imporditav, ja näitab versiooni. python -m pip list kuvab paigaldatud paketid. Ära kasuta virtuaalkeskkonnas sudo pip-i.

Salvesta sõltuvused, mitte keskkonnakataloog

pip freeze väljastab paigaldatud pakettide versioonid. Uues katseprojektis saad need salvestada:


python -m pip freeze > requirements.txt
cat requirements.txt

> kirjutab faili üle: olemasolevas projektis ära asenda sõltuvusfaili enne selle otstarbe kontrollimist. freeze sisaldab ka kaudseid sõltuvusi; see pole garantii, et keskkond töötab muutmata igas operatsioonisüsteemis või iga Pythoni versiooniga.

Teine inimene loob oma .venv ja paigaldab paketid kujul python -m pip install -r requirements.txt. -r tähendab, et paketinimed loetakse failist. Giti läheb sõltuvusfail, mitte .venv/; ära eelda, et keskkonnakataloogi kopeerimine teise masinasse töötab.

Väljumine ja järgmine tööpäev

deactivate taastab shelli varasema keskkonna. See ei kustuta pakette ega projekti. Järgmisel korral liigu projekti ja aktiveeri olemasolev keskkond; uut venv-i ei ole iga kord vaja luua.

Aktiveerimine pole kohustuslik: .venv/bin/python skript.py valib sama tõlgendaja otse. See on kasulik ajastatud töödes ja IDE seadistuses.

Piirid ja levinud vead

  • No module named venv või ensurepip puudub: Linuxi jaotus võib vajada eraldi python3-venv paketti. Vaata oma paketihaldust, mitte ära asenda süsteemi Pythonit juhuslikult.
  • externally-managed-environment: paigaldad tõenäoliselt süsteemi Pythonisse. Loo või vali virtuaalkeskkond; ära lülita süsteemi kaitset välja.
  • IDE ei leia paketti: vali IDE-s projekti .venv/bin/python ja võrdle selle teed terminali omaga.
  • Pakett vajab süsteemiteeki: venv ei paigalda uut operatsioonisüsteemi ega isoleeri süsteemiteeke. Selline sõltuvus võib vajada paketihaldurit või Dockerit.
  • Võõras kood: virtuaalkeskkond ei ole turvaliivakast. Programm saab endiselt lugeda sinu faile ja kasutada võrku sinu õigustega.

Minitest

  1. Kontrolli Pythoni täisteed enne aktiveerimist ja pärast seda.
  2. Paigalda katsepakett ning tõesta impordiga, et kasutad õiget keskkonda.
  3. Lõpeta aktiveerimine. Kas saad sama paketti kasutada käsuga .venv/bin/python?
  4. Miks jagatakse requirements.txt, mitte kogu .venv kataloogi?

Lisalugemine

Pythoni venv-juhend ja pakettide paigaldamise juhend selgitavad loomist, aktiveerimist ja piiranguid.

Peatüki täisspikker

Edasijõudnu

Eesmärk

venv hoiab ühe projekti Pythoni paketid eraldi; kõige olulisem on, et terminal, pip ja IDE näeksid sama keskkonda.

Põhikujud

  • python3 -m venv .venvloo keskkond
  • source .venv/bin/activateaktiveeri shellis
  • python -m pip install -U pipuuenda pip
  • python -m pip install requestspaigalda pakett
  • python -m pip listvaata pakke
  • command -v pythonkontrolli tõlgendit
  • deactivatevälju keskkonnast

Olulised märgid

  • (.venv)aktiivne keskkond
  • .venv/projekti sees
  • python -m pipkindlam kui pip
  • Dockerterve keskkond

Dockeri alused

Loogika

Docker aitab panna rakenduse koos käivituskeskkonnaga ühte korratavasse pakki.

Kõige tähtsam mõttejärjekord on:

  1. vali või koosta konteinerkuju (image)
  2. käivita sellest konteiner
  3. seo vajadusel port või kataloog hostsüsteemiga
  4. vaata logisid ja käivita käske konteineri sees
  5. kui teenuseid on mitu, kirjelda need compose.yaml failis

Git ja venv ei kao Dockeri tõttu ära. Tavaliselt asub lähtekood hostsüsteemi Giti hoidlas ning Docker annab koodile ühtse käivituskeskkonna.

Kiire orientiir

Mõiste või käskMilleksMida tavaliselt näed
konteinerkuju (image)käivitusmallnimi ja märgend, näiteks python:3.13-slim
konteinerkonteinerkujust käivitatud protsesstöötav või peatatud eksemplar
Dockerfilekonteinerkuju koostamise retseptFROM, WORKDIR, COPY, RUN, CMD
docker buildkoosta konteinerkujukoostamiskihid ja kuju nimi
docker runkäivita konteinerprogrammi väljund või konteineri ID
docker psvaata töötavaid konteinereidkonteinerite tabel
docker logsloe konteineri väljunditprogrammi logiread
docker execkäivita käsk töötavas konteineriskäsu väljund konteineri seest
docker composekäivita seotud teenusedteenuste logid ja seis

Tüüpilised algaja vead

  • aetakse segi konteinerkuju (image) ja konteiner
  • arvatakse, et konteineri sees käsitsi muudetud failid jäävad alati alles
  • kasutatakse docker exec konteineri käivitamiseks, kuigi see töötab ainult juba töötavas konteineris
  • eeldatakse, et depends_on tähendab andmebaasi täielikku valmisolekut
  • pannakse konteinerisse venv ainult harjumusest, kuigi konteiner ise juba isoleerib keskkonda
  • kustutatakse käsuga docker compose down -v kogemata andmebaasi andmeköide

Kas Docker töötab

Enne esimese näite tegemist kontrolli, kas Docker on masinas olemas ja teenus töötab.


docker --version
docker compose version
docker run --rm hello-world

hello-world on väike katsetamiseks mõeldud konteinerkuju. Esimesel käivitamisel võib Docker selle internetist alla laadida.

macOS-is ja Windowsis tähendab Docker tavaliselt Docker Desktopi või muud taustal töötavat virtuaalmasinakihti. Kui käsk ütleb, et Dockeri deemon ei tööta, ava Docker Desktop ja proovi uuesti.

Konteinerkuju (image) ja konteiner

Konteinerkuju (image) on valmis käivitusmall. Konteiner on sellest mallist käivitatud konkreetne eksemplar.

Ühest konteinerkujust võib korraga töötada mitu konteinerit:


docker run --rm alpine echo tere
docker run --rm alpine uname -a

Siin:

  • alpine on konteinerkuju
  • echo tere või uname -a on käsk, mis käivitatakse konteineri sees
  • --rm kustutab konteineri pärast lõpetamist

Oluline algaja kaitsepiire: konteiner on vahetatav. Kui tahad andmeid säilitada, hoia need hostsüsteemi kataloogis, nimega andmeköites (named volume) või Giti hoidlas.

venv vs Docker

venv ja Docker lahendavad eri probleemi.

OlukordTavaliselt sobib
ainult Pythoni paketid peavad olema eraldivenv
vaja on kindlat Linuxi keskkonda või süsteemipaketteDocker
projekt vajab andmebaasi, vahemälu või mitut teenustDocker Compose
tahad kiiresti väikest kohalikku skripti tehavenv
meeskonnal peab sama rakendus eri masinates sarnaselt käivitumaDocker

Dockeri sees ei ole eraldi venv enamasti vajalik. Kui üks konteiner käitab üht rakendust, on konteiner ise eralduskiht.

Esimene väike Dockerfile

Kõige selgem esimene näide on väike programm, mille konteinerkuju ise käivitab.


mkdir -p ~/tmp/docker-naide
cd ~/tmp/docker-naide

app.py


print("Tere konteinerist")

Dockerfile


FROM python:3.13-slim
WORKDIR /app
COPY app.py .
CMD ["python", "app.py"]

Siin:

  • FROM python:3.13-slim valib Pythoni baaskeskkonna
  • WORKDIR /app määrab töökataloogi konteineri sees
  • COPY app.py . kopeerib faili konteinerkujusse
  • CMD ["python", "app.py"] ütleb vaikimisi käivitatava käsu

Ehita ja käivita:


docker build -t tere-rakendus .
docker run --rm tere-rakendus

Tulemus peaks olema:


Tere konteinerist

Punkt . käsu lõpus tähistab koostamiskonteksti (build context): kataloogi, mille sisu Docker koostamise ajal näeb.

.dockerignore

Koostamiskontekst ei peaks sisaldama kõike, mis projektikataloogis on.

Tüüpiline .dockerignore:


.git
.venv
.env
.env.*
__pycache__/
dist/
*.log

See kiirendab koostamist ja vähendab ohtu, et konteinerkujusse satub juhuslikke kohalikke faile.

docker run: käsk, port ja nimi

docker run loob uue konteineri ja käivitab selle.


docker run --rm python:3.13-slim python --version

Kui konteineri sees töötab server, tuleb port hostsüsteemiga siduda.


docker run --rm -d --name pyweb -p 127.0.0.1:8000:8000 python:3.13-slim python -m http.server 8000

Siin:

  • -d paneb konteineri taustale
  • --name pyweb annab konteinerile nime
  • -p 127.0.0.1:8000:8000 seob ainult kohaliku arvuti pordi 8000 konteineri pordiga 8000; ilma 127.0.0.1-ta võib port olla avatud ka võrgust

Kontroll:


docker ps
docker logs pyweb

Brauseris peaks teenus olema aadressil:


http://localhost:8000

Kui port on juba kasutusel, vali vasakul pool teine hosti port, näiteks -p 127.0.0.1:8080:8000.

logs ja exec

Kui konteiner on juba käimas, alusta veaotsingut logidest.


docker logs pyweb
docker logs -f pyweb

-f jälgib logi jooksvalt. Katkesta jälgimine Ctrl-c-ga enne järgmist käsku; see ei peata konteinerit.

Käsk konteineri sees:


docker exec pyweb pwd
docker exec -it pyweb sh

docker exec ei loo uut konteinerit. See käivitab käsu olemasolevas töötavas konteineris.

Interaktiivsest sh-st välju käsuga exit. Kui brauserikatse, logid ja exec on proovitud, peata hosti terminalis konteiner käsuga docker stop pyweb. Valiku --rm tõttu eemaldatakse see siis ka nimekirjast. Väikeses konteinerkujus ei pruugi bash-i olla; sh on sagedamini olemas.

Hostitee sidumine konteinerisse

Koostatud konteinerkuju sobib valmis rakenduse proovimiseks. Arenduses tahad sageli, et konteiner näeks kohe sinu praegust projektikataloogi.


docker run --rm -it --mount type=bind,src="$PWD",dst=/app -w /app python:3.13-slim sh

Sama lühem, vanem ja väga levinud kuju on:


docker run --rm -it -v "$PWD":/app -w /app python:3.13-slim sh

Siin:

  • src="$PWD" või "$PWD" on sinu praegune kataloog hostsüsteemis
  • dst=/app või /app on sama kataloog konteineri sees
  • -w /app teeb sellest töökataloogi

Konteineri sees käivita varem loodud app.py, seejärel välju. Pakettide paigaldamine ja testimine vajavad projekti sõltuvusfaili ning teste; neid esimene näide veel ei sisalda:


python app.py
exit

Hostitee sidumise (bind mount) korral muutub hostsüsteemi fail kohe. See on arenduses mugav, kuid tähendab ka, et konteineris tehtud muudatus võib muuta sinu töökataloogi.

Konteineri peatamine üksi ei kustuta selle kirjutatavat kihti. Andmed kaovad konteineri eemaldamisel, näiteks --rm või docker compose down korral, kui need pole seotud hostitee või andmeköitega.

Nimega andmeköide

Hostitee sidumine ühendab konteineri hostsüsteemi kindla faili või kataloogiga. Nimega andmeköide (named volume) on Dockeri hallatav püsiv andmeala.

Kõige tavalisem kasutus on andmebaasi andmed:


volumes:
  pgdata:

Järgmine on ainult teenusekirjelduse katkend, mitte iseseisev käivitatav fail. Täielik fail koos parooli ja teenustega tuleb allpool:


services:
  db:
    image: postgres:16
    volumes:
      - pgdata:/var/lib/postgresql/data

Pea meeles:

  • docker compose down peatab ja eemaldab teenuste konteinerid ning võrgu
  • docker compose down -v eemaldab ka nimega andmeköited
  • andmebaasi andmeköite kustutamine tähendab sageli andmete kustutamist

Arenduse tööjaotus

Hea algaja tööjaotus on:

KusMida tee
hostsüsteemismuuda faile, salvesta muudatusi Gitiga, hoia dokumentatsiooni
konteineriskäivita rakendus, paigalda sõltuvusi, testi, silu keskkonda
andmeköites (volume)hoia andmeid, mis peavad konteineri vahetamisel alles jääma

Väldi olulise koodi kirjutamist ainult konteineri sisemisse failisüsteemi. Kui konteiner kustub, võib see töö kaduda.

Kui rakendus vajab pakette

Pythoni projektis on sõltuvused sageli failis requirements.txt. Järgmine variant näitab paigalduse asukohta Dockerfile'is. Versioonita requests valib paigaldushetkel sobiva versiooni; korduvaks koostamiseks salvesta oma läbiproovitud versioonid, nagu venv-peatükis.

requirements.txt


requests

Dockerfile


FROM python:3.13-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
CMD ["python", "app.py"]

Siin on oluline järjekord:

  • sõltuvuste fail kopeeritakse enne rakenduse koodi
  • RUN pip install ... jääb võimalusel koostamisvahemällu
  • COPY app.py . tuleb hiljem, sest rakenduse kood muutub sagedamini

docker compose: mitu teenust korraga

Kui projekt vajab rakendust ja andmebaasi, muutub üks pikk docker run käsk ebamugavaks. Siis kirjelda teenused failis compose.yaml.


services:
  app:
    image: python:3.13-slim
    working_dir: /app
    volumes:
      - .:/app
    command: python -m http.server 8000
    ports:
      - "127.0.0.1:8000:8000"

  db:
    image: postgres:16
    environment:
      POSTGRES_DB: opik
      POSTGRES_USER: opik
      POSTGRES_PASSWORD: opikpass
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:

See kohalik katse käivitab kaks teenust, kuid HTTP-failiserver ei kasuta veel andmebaasi. Parool opikpass on ainult harjutuseks; andmebaasi porti ei avaldata hostile. Failiserver jagab praegust katsekataloogi, seega ära kasuta saladusi sisaldavat projekti.

Käivita teenused taustal:


docker compose up -d
docker compose logs db

Kui logi järgi võtab andmebaas ühendusi vastu, kontrolli seda. psql on PostgreSQL-i klient, -U määrab kasutaja, -d andmebaasi ja -c täidetava SQL-käsu:


docker compose exec db psql -U opik -d opik -c 'SELECT 1;'

Tulemuses näed väärtust 1. Ava HTTP-teenus brauseris ja lõpeta katse:


docker compose down

Logi saab pikemalt jälgida käsuga docker compose logs -f app; enne järgmisi käske katkesta jälgimine Ctrl-c-ga. Interaktiivsest docker compose exec app sh shellist välju exit-iga.

Tähendused:

  • up käivitab teenused ja näitab logisid
  • up -d käivitab teenused taustal
  • logs -f app jälgib ühe teenuse logi
  • exec app sh avab käsu töötavas teenusekonteineris
  • down peatab ja eemaldab selle compose-projekti konteinerid ning võrgu

Uues Dockeris kasutatakse kuju docker compose. Vanemates juhendites võid näha kuju docker-compose.

depends_on ei ole valmisolekukontroll

Compose'is näed sageli:


depends_on:
  - db

See aitab käivitusjärjekorraga, kuid ei tähenda automaatselt, et andmebaas on juba ühendusteks valmis.

Päris projektis võib vaja minna:

  • rakenduse enda korduskatsete loogikat
  • andmebaasi tervisekontrolli (healthcheck)
  • käivitusskripti, mis ootab teenuse valmidust

Algaja jaoks piisab esialgu teadmisest: kui app ütleb käivitumisel, et andmebaas pole valmis, vaata esmalt docker compose logs db ja proovi pärast hetke uuesti.

Millal valida run, build või compose

VajadusSobiv tööriist
proovi üht käsku puhtas konteinerkujusdocker run --rm alpine uname -a
kontrolli valmis rakenduse konteinerkujudocker build ja docker run
arenda koodi konteineri sees, kuid failid jäävad hostsüsteemihostitee sidumine
käivita rakendus koos andmebaasi või muu teenusegadocker compose
IDE avab kogu tööruumi konteinerisarenduskonteiner ehk devcontainer

See valik vähendab segadust: ära kasuta Compose'i ainult ühe lühikese käsu käivitamiseks ega kirjuta üht väga pikka docker run käsku, kui projektis on mitu teenust.

Ohutus ja privaatsus

Konteiner ei ole maagiline turvasein.

Ole ettevaatlik, kui:

  • konteinerkuju on tundmatust allikast
  • seod konteineriga hostsüsteemi katalooge
  • paned keskkonnamuutujatesse paroole või võtmeid
  • näed juhendit, mis seob konteineriga Dockeri sokli, näiteks /var/run/docker.sock
  • käsk kasutab --privileged

Algaja hea reegel: ära käivita võõrast konteinerkuju nii, et seod sellega oma kodukataloogi või salajased failid.

Kettaruumi kontroll ja koristamine

Docker võib aja jooksul koguda konteinerkujusid, peatatud konteinereid ja koostamisvahemälu.

Ohutu vaatamine:


docker system df
docker ps -a
docker images

Koristuskäske kasuta alles siis, kui saad aru, mida need kustutavad:


docker container prune
docker image prune

Need ei ole esimesed õppimiskäsud. Need on hilisemaks, kui Docker on juba igapäevases kasutuses.

Seos arenduskonteineritega

Arenduskonteiner ehk devcontainer on Dockeri peale ehitatud IDE-töövoog.

Tavaliselt toimub nii:

  • Docker käivitab konteineri
  • IDE ühendub konteineriga
  • projektikataloog seotakse tööruumina
  • terminal, testid ja keele tööriistad töötavad konteineris

Arenduskonteiner ei asenda Dockeri põhimõtteid. Ta teeb sama loogika mugavamaks, eriti siis, kui projekt vajab keerulisemat keskkonda.

Minitest

  1. Mis vahe on konteinerkujul (image) ja konteineril?
  2. Miks on --rm kasulik lühikeste katsete puhul?
  3. Mida teeb -p 127.0.0.1:8000:8000?
  4. Mis vahe on hostitee sidumisel ja nimega andmeköitel (named volume)?
  5. Millal valid docker compose tavalise docker run asemel?
  6. Miks ei tasu docker compose down -v käsu tähendust arvamata käivitada?

Lisalugemine

Selle teema usaldusväärsemad viited leiad lisast Lisa E: usaldusväärsed viited ja lisalugemine.

Peatüki täisspikker

Edasijõudnu

Eesmärk

Konteinerkuju (image) on käivitusmall; konteiner võib töötada või olla peatatud. Konteineri eemaldamisel kaob selle kirjutatav kiht, mitte seotud hostifailid ega püsivad andmeköited.

Põhikäsud

  • docker --versionkontrolli olemasolu
  • docker run --rm alpine echo tereohutu esimene käivitus
  • docker build -t rakendus .koosta konteinerkuju
  • docker run --rm rakenduskäivita konteiner
  • docker pstöötavad konteinerid
  • docker logs -f nimijälgi logi
  • docker exec -it nimi shsisene töötavasse konteinerisse
  • docker compose up -dteenused taustale
  • docker compose downpeata ja eemalda konteinerid ning võrk

Olulisemad lipud, märgid ja kiirnupud

  • imagekonteinerkuju ehk käivitusmall
  • konteinerkäivitatud või peatatud eksemplar
  • Dockerfilekonteinerkuju retsept
  • compose.yamlmitu teenust
  • volumepüsiv andmeköide
  • registrykonteinerkujude hoidla
  • --rmkustuta lühikatse konteiner pärast lõppu
  • -p 127.0.0.1:8000:8000docker run: avalda port ainult oma arvutile
  • --mount type=bind,src="$PWD",dst=/appjaga praegune kataloog konteinerisse
  • -w /appmäära konteineri töökataloog
  • docker compose down -vpeatab ja kustutab ka andmeköited

IDE-d ja arenduskeskkonnad

IDE (*Integrated Development Environment*) ehk integreeritud arenduskeskkond ühendab redaktori, käivitamise ja silumise. Kontrolli, et selle tööriistad kasutaksid sama projekti ja keelekeskkonda.

Kiirülevaade

Eesmärk on panna terminal, Git, tõlgendaja ja vajadusel konteinerid töötama sama projektiga.

Kontroll või valikMilleksMida tavaliselt näed
--version käsudkontrolli tööriista olemasoluüks lühike versioonirida
IDE tõlgendajavali projekti Python, Node vmsvalitud keskkond IDE seadetes
sisseehitatud terminalkäivita käske projekti kontekstissama töökataloog ja projektifailid
devcontainer või Dockeranna projektile eraldi käivituskeskkondkonteineri terminal ja tööriistad
puuduv tööriistvajab paigaldust või PATH-i parandustveateade command not found või selle vaste

Tüüpilised algaja vead

  • arvatakse, et IDE „teab ise“, millist Pythoni või Node'i kasutada
  • terminal ja IDE kasutavad eri keskkondi
  • proovitakse korraga liiga palju tööriistu, kuigi alguses piisab lihtsast tervikust

Soovitatav lähtekoht

Algajale on tavaliselt hea kombinatsioon:

  • terminal
  • üks kerge tekstiredaktor või IDE
  • Git
  • Python või muu põhitööriist

Levinud valikud

  • VS Code: väga levinud, laiendatav ja hea Remote SSH toega
  • PyCharm: tugev Pythoni tugi
  • Vim või Neovim: kiire klaviatuuripõhine töö
  • JetBrainsi tööriistad üldisemalt: tugev projektitugi

Mida IDE-s jälgida

  • sisseehitatud terminal
  • Giti lõiming
  • projekti virtuaalkeskkond
  • Dockeri tugi
  • kaugühenduste tugi

VS Code ja arenduskonteinerid

Kui projekt kasutab Dockerit, on järgmine samm sageli arenduskonteiner.

Selle põhimõte on:

  • projektifailid jäävad sinu masinasse
  • VS Code avab sama projekti Dockeri konteineri sees
  • terminal, tõlgendaja ja tööriistad töötavad konteineris

See aitab eriti siis, kui:

  • projekt vajab kindlat Linuxi keskkonda
  • mitmel arendajal peab olema sama töölaud
  • hostsüsteemi ei taheta liigsete tööriistadega täita

Lühidalt:

  • venv aitab Pythoni pakettidega
  • Docker aitab kogu keskkonnaga
  • arenduskonteiner ühendab selle IDE kasutusmugavusega

Minimaalne devcontainer.json

Näide eeldab töötavat Dockerit, VS Code'i laiendust Dev Containers ning projekti juures olemasolevat requirements.txt faili. postCreateCommand käivitatakse konteineri loomisel; see on päris käsk, mitte pelgalt kirjeldus.

.devcontainer/devcontainer.json


{
  "name": "Python Dev Container",
  "image": "python:3.13-slim",
  "workspaceFolder": "/workspace",
  "workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind",
  "postCreateCommand": "python -m pip install -r requirements.txt",
  "customizations": {
    "vscode": {
      "extensions": [
        "ms-python.python",
        "ms-python.vscode-pylance"
      ]
    }
  }
}

Mida see tähendab:

  • kasutatakse olemasolevat Pythoni konteinerkuju (image)
  • kohalik projekt seotakse kataloogiga /workspace
  • pärast loomist paigaldatakse sõltuvused
  • VS Code saab automaatselt vajalikud laiendused

Tüüpiline töövoog arenduskonteineriga

  1. paigalda VS Code'is laiendus Dev Containers
  2. ava projektikataloog
  3. vali käsk Dev Containers: Reopen in Container
  4. oota, kuni konteiner ehitatakse või käivitatakse
  5. tööta edasi nagu tavaliselt, aga IDE terminal on nüüd konteineri sees

Hea mõte on jälgida:

  • kus töötab Python või Node
  • kus tehakse pip install või npm install
  • kas avatud terminal on hostis või konteineris

Kontrolli vajalikke tööriistu

Kontrolli, kus Python süsteemist leitakse:


command -v python3
python3 --version
python3 -m pip --version

Kontrolli, kas Git ja Docker on saadaval:


git --version
docker --version

Kontrolli Node.js ja npm olemasolu:


node --version
npm --version

Pythoni töövoog IDE-s

Pythoni projektis tasub tavaliselt siduda IDE konkreetse virtuaalkeskkonnaga:

  1. loo projektis .venv
  2. vali IDE-s tõlgendajaks selle keskkonna Python
  3. paigalda sõltuvused sinna, mitte süsteemi suvalisse asukohta

Node.js ja npm töövoog IDE-s

JavaScripti või TypeScripti projektis tasub jälgida:

  • kas projektis on package.json
  • kas sõltuvused on paigaldatud käsuga npm install
  • millised skriptid on kirjas plokis scripts

npm install paigaldab sõltuvused; npm run dev ja npm test töötavad ainult siis, kui projekt on need skriptid määranud. Vaata enne package.json sisu: paigaldus võib käivitada projekti või pakettide skripte.

Tüüpilised käsud:


npm install
npm run dev
npm test

Seadistuse ametlik kirjeldus: VS Code: töökausta sidumine konteineriga.

Minitest

  1. Pane kirja, millist redaktorit või IDE-d sa kasutad.
  2. Kontrolli, kas IDE terminal kasutab sama shelli nagu tavaline terminal.
  3. Uuri, kuidas selles IDE-s Giti versioonikirjet (commit) luua.
  4. Kontrolli, kuidas valida IDE-s Pythoni tõlgendaja või Node.js-i projekt.
  5. Kui kasutad VS Code'i, uuri, kus menüüs on Reopen in Container.

Peatüki täisspikker

Edasijõudnu

Eesmärk

heas arenduskeskkonnas osutavad terminal, Git, tõlgendaja ja vajaduse korral konteiner samale projektile.

Kontrollid ja valikud

  • python3 --versionkontrolli Pythonit
  • python3 -m pip --versionkontrolli pip-i
  • git --versionkontrolli Giti
  • docker --versionkontrolli Dockerit
  • node --versionkontrolli Node'i
  • npm --versionkontrolli npm-i

Olulised mõisted

  • tõlgendajakoodi tegelik käivitaja
  • sisseehitatud terminalsama projektivaade
  • Remote SSHtööta kaugmasinas
  • devcontainerIDE konteineris

Andmeteaduse eelteadmised käsurea vaates

Loogika

Kui räägitakse andmeteaduse eelteadmistest, siis tavaliselt mõeldakse vähemalt neid plokke:

  • programmeerimine, eriti Python
  • andmebaasid, SQL ja relatsiooniline mõtteviis
  • failivormingud nagu CSV, JSON ja XML
  • statistika, tõenäosusteooria ja matemaatiline mõtlemine

Käsurida ei asenda neid oskusi, kuid aitab neid omavahel siduda.

Just siin on käsurea suur väärtus:

  • näed kiiresti, mis failid sul üldse on
  • saad kontrollida andmete kuju enne suurema keskkonna avamist
  • saad teha väikseid filtreid, loendusi ja ümberkujundusi
  • õpid töövoogu, mis on hiljem kasulik ka Pythonis, SQL-is ja Dockeris

Kiirülevaade

Eesmärk on siduda käsurida andmeteaduse eelteadmistega: mitte õpetada kogu statistikat või Pythonit, vaid näidata, kuidas andmete kuju ja töövoog nähtavaks teha.

Teema või tööriistMilleksMida praktikas näed
programmeeriminekorda andmetöötlussammeskriptid ja korduvad käivitused
SQL ja andmebaasidstruktureeri ja küsi andmeidtabelid, võtmed ja päringud
failivormingudmäära, kuidas andmeid lugedaCSV read, JSON puud, XML märgendid
matemaatika ja statistikaanna tulemustele sisuanalüüs, mida käsurida üksi ei asenda
head, column, jq, wc, sqlite3tee esimene kontrollfaili kuju, read, veerud ja mahud
Python, SQL, notebook-keskkondtee põhjalikum analüüssuurem töövoog pärast esmast kontrolli

Tüüpilised algaja vead

  • arvatakse, et andmeteadus algab kohe suure mudeli või teegiga
  • minnakse otse keerukasse analüüsi enne, kui andmefaili kuju on kontrollitud
  • alahinnatakse failivormingute ja töövoo korrastatuse tähtsust

See õpik katab tugevamalt:

  • käsurea loogika
  • failide ja voogude töötluse
  • Pythoni keskkonnad
  • SQLite'i ja SQL-i alguse
  • arendustöövoo, Giti ja Dockeri

See õpik ei püüa eraldi õpetada põhjalikult:

  • statistikat
  • tõenäosusteooriat
  • lineaaralgebrat
  • R-i

Kõige tavalisemad vajadused

Programmeerimine

Andmetöö juures tähendab see sageli:

  • väikest automaatikat
  • andmete lugemist failist
  • tulemuste salvestamist
  • skriptide korduvat käivitamist

See tuleb kõige rohkem välja Pythoni, shelliskriptide ja töövoogude peatükkides.

Andmevormingud

Sageli ei ole probleem statistikas, vaid selles, et:

  • fail on vales vormingus
  • veerud ei ole seal, kus arvasid
  • kirjed on pesastatud
  • andmed on teksti sees, mitte tabelina

Seetõttu on CSV, JSON ja XML mõistmine väga praktiline baasoskus.

SQL ja relatsiooniline mõtteviis

SQL ei tähenda ainult „käsku andmebaasile“, vaid ka kindlat andmemudelit.

Kasulikud põhiküsimused on:

  • mis on tabel
  • mis on rida ja veerg
  • mis on primaarvõti
  • kuidas kaks tabelit omavahel seotakse

Kui see loogika on olemas, on ka keerulisemad päringud palju vähem müstilised.

Statistika ja matemaatiline mõtlemine

Seda osa ei saa käsurea või SQL-iga asendada.

Tööjaotus on järgmine:

  • käsurida aitab andmeid ette valmistada
  • Python või R aitab neid töödelda
  • statistiline mõtlemine aitab tulemusi mõista

Kõik kolm on eri asjad.

Näited

Tüüpiline väike andmetöö võib kulgeda nii:

  1. vaata faili esimesi ridu
  2. kontrolli, mis väljad seal on
  3. tee lihtne filtreerimine või loendus
  4. pane andmed SQLite tabelisse
  5. tee esimene SQL-päring
  6. loe tulemus Pythoniga sisse

Vastav töövoog võib olla:


fail -> head/less/grep -> column/cut/tr -> sqlite3 -> python3

Seetõttu on käsurida andmeteaduse alguses kasulik:

  • see aitab väikeste sammudega kiiresti ülevaate saada
  • see ei sunni kohe suurt keskkonda avama
  • see muudab veaallikad nähtavamaks

Minitest

  1. Nimeta neli plokki, mida andmeteaduse eelteadmistena kõige sagedamini mainitakse.
  2. Selgita ühe lausega, miks CSV, JSON ja XML ei ole sama asi.
  3. Selgita ühe lausega, miks SQL ja statistika ei ole asendatavad oskused.
  4. Pane kirja üks väike töövoog, kus kasutaksid nii käsurida, SQLite'i kui Pythonit.

Peatüki täisspikker

Edasijõudnu

Eesmärk

andmeteaduse stardis ei piisa ühest tööriistast; vaja on korraga failivormingute tunnetust, SQL-i mõtteviisi, programmeerimist ja statistilist mõtlemist.

Põhikujud

Põhiteljed

  • programmeeriminekorduv töö loogikaks
  • SQLküsi ja seo andmeid
  • vormingudCSV, JSON, XML
  • statistikaanna tähendus

CSV, JSON ja XML käsureal

Loogika

Need kolm vormingut esindavad sageli kolme eri mõtteviisi:

  • CSV on tavaliselt lihtne tabel
  • JSON on sageli objektide ja massiivide puu
  • XML on märgenditega puustruktuur

Kui saad aru, millist kuju andmed võtavad, on palju lihtsam otsustada:

  • kas kasutada cut, column ja sort
  • kas võtta appi jq
  • kas minna edasi SQLite'i või Pythoni juurde

Oluline praktiline mõte on:

  • käsurida sobib hästi kiireks vaatamiseks
  • keerulisema loogika jaoks on sageli parem minna Pythonisse või SQL-i

Kiirülevaade

Eesmärk on kiiresti ära tunda andmete kuju ja valida selle järgi järgmine tööriist.

Vorming või käskMilleksMida tavaliselt näed
CSVlihtne tabelread ja väljad
JSONobjektide ja massiivide puutaandega struktuur või valitud võtmed
XMLmärgenditega puuelemendid ja pesastatud struktuur
headvaata faili algustesimesed read
columntee lihtne tabel loetavamaksjoondatud veerud
python3 -m json.tool, jqvaata JSON-ivormindatud või filtreeritud JSON
xmllintvorminda XMLloetavam märgendipuu

Tüüpilised algaja vead

  • aetakse segi tabeli, puu ja märgendipõhise struktuuri loogika
  • proovitakse keerukat CSV-d töödelda liiga lihtsa eraldajaloogikaga
  • eeldatakse, et kõik JSON-failid koosnevad lihtsatest ühetaolistest võtme-väärtuse paaridest

Kõige tavalisemad tööriistad

CSV

Lihtsa CSV puhul on väga kasulikud:

  • head
  • column
  • cut
  • sort
  • wc

Tähtis hoiatus:

  • CSV võib sisaldada jutumärke, väljade sees komasid ja reavahetusi
  • siis ei pruugi cut -d, olla enam piisavalt täpne

Seega:

  • kiireks vaatamiseks on shell väga hea
  • keerulise CSV jaoks on parem kasutada Pythonit või selleks mõeldud tööriista

JSON

JSON on väga levinud:

  • API vastustes
  • seadistusfailides
  • logides
  • veebiteenuste väljundis

Kõige praktilisemad esimesed tööriistad on:

  • python3 -m json.tool
  • jq

Kui jq puudub, saad JSON-i vähemalt ilusti vaadata python3 -m json.tool käsuga.

XML

XML-i kohtab tänapäeval vähem kui JSON-i, kuid see on endiselt oluline:

  • vanemates süsteemides
  • teaduslikes andmevahetustes
  • mõnes konfiguratsioonis
  • dokumentide ja metaandmete juures

Hea algreegel:

  • grep sobib kiireks piilumiseks
  • xmllint sobib ilusaks vorminduseks
  • keerulisema XML loogika jaoks on parem kasutada spetsiaalsemaid tööriistu või Pythonit

Näited

Näide: lihtne CSV


cat > tudengid.csv <<'EOF'
name,city,score
Mari,Tartu,91
Jaan,Tallinn,84
Liis,Narva,88
EOF

Vaatame faili:


head -n 4 tudengid.csv
column -s, -t < tudengid.csv
cut -d, -f1 tudengid.csv

Siin:

  • head näitab algust
  • column muudab lihtsa CSV visuaalselt tabeliks
  • cut -d, -f1 võtab esimese veeru

Näide: lihtne JSON


cat > tudengid.json <<'EOF'
{
  "students": [
    {"name": "Mari", "city": "Tartu", "score": 91},
    {"name": "Jaan", "city": "Tallinn", "score": 84},
    {"name": "Liis", "city": "Narva", "score": 88}
  ]
}
EOF

Vaatame JSON-i:


python3 -m json.tool tudengid.json
jq '.students[].name' tudengid.json

Siin:

  • python3 -m json.tool teeb JSON-i loetavaks
  • jq '.students[].name' käib massiivi läbi ja võtab nimed

Näide: lihtne XML


cat > tudengid.xml <<'EOF'
<students>
  <student city="Tartu">
    <name>Mari</name>
    <score>91</score>
  </student>
  <student city="Tallinn">
    <name>Jaan</name>
    <score>84</score>
  </student>
</students>
EOF

Vaatame XML-i:


grep '<name>' tudengid.xml
xmllint --format tudengid.xml

Siin:

  • grep võimaldab kiiresti märgendeid otsida
  • xmllint --format teeb struktuuri palju loetavamaks

Kui xmllint puudub, ei ole see üllatav: tööriist ei ole igas süsteemis vaikimisi olemas.

CSV kirje ei pruugi olla üks tekstirida. Jutumärkides välja sees võib olla reavahetus; wc -l loendab reavahetusi, mitte CSV kirjeid. Selliste andmete jaoks kasuta CSV-parserit, mitte cut -d,.

Minitest

  1. Loo üks väike CSV fail kolme reaga ja kuva see column abil tabelina.
  2. Loo üks väike JSON fail ja kuva sellest ainult nimed.
  3. Loo üks väike XML fail ja otsi sellest üks märgend grep abil.
  4. Selgita ühe lausega, miks cut -d, ei pruugi keeruka CSV-faili töötlemiseks piisata.

Lisalugemine

Selle teema usaldusväärsemad viited leiad lisast Lisa E: usaldusväärsed viited ja lisalugemine.

Peatüki täisspikker

Edasijõudnu

Eesmärk

vormingu tüüp ütleb, milline tööriist mõistab andmeid kõige loomulikumalt: tabelit, puud või märgendistruktuuri.

Põhikujud

  • head fail.csvvaata CSV algust
  • column -s, -t < fail.csvjoonda lihtne CSV
  • cut -d, -f1 fail.csvvõta üks veerg
  • python3 -m json.tool fail.jsonvorminda JSON
  • jq '.students[].name' fail.jsonvali JSON välju
  • xmllint --format fail.xmlvorminda XML

Olulised mõisted

  • CSVlihtne tabel
  • JSONobjektide puu
  • XMLmärgendipuu
  • jqJSON filtriks

Andmebaasi algus: SQLite ja Python

SQLite salvestab andmebaasi ühte faili ega vaja eraldi serverit. Kasutame seda küsimuse lahendamiseks: kuidas siduda õppijad nende tulemustega ja arvutada keskmine, kordamata igal real õppija põhiandmeid?

MõisteTähendus selles näites
tabelühe teema kirjed, näiteks õppijad
rida / veergüks õppija / üks omadus, näiteks nimi
primaarvõti (*primary key*)rea kordumatu tunnus id
võõrvõti (*foreign key*)tulemuserea viide õppija tunnusele
JOINseo tabelite read võtme järgi
GROUP BYkoonda read ühise tunnuse järgi

Turvaline harjutuskoht ja tööriist

Vaja on käsku sqlite3. Pythoni moodul sqlite3 võib olla olemas ka siis, kui eraldi käsureaprogramm puudub. Vajadusel vaata paketihaldust.

mktemp -d loob uue kordumatu nimega kataloogi ja väljastab selle tee. Käsuasendus $(...) salvestab tee muutujasse, nii et näide ei kirjuta varasemat andmebaasi üle:


katse=$(mktemp -d)
cd "$katse"
pwd

Jäta tee meelde. Ajutises kataloogis olevat tööd võib süsteem hiljem koristada; see on katse, mitte püsivate andmete asukoht.

sqlite3 andmed.db avab interaktiivse SQL-käsurea; väljumiseks kirjuta .quit. Punktiga käsud, näiteks .tables ja .schema, on SQLite'i kliendi käsud, mitte SQL.

Loo õppijate tabel

CREATE TABLE loob tabeli, INSERT INTO lisab kirjed ja SELECT loeb neid. INTEGER on täisarv, TEXT tekst ning NOT NULL keelab puuduva väärtuse. SQL-laused lõpevad semikooloniga.

Shelli <<'SQL' annab käsule mitmerealise sisendi kuni eraldi real oleva SQL-ini. Valikud -header -column kuvavad tulemuse veerupealkirjadega tabelina.


sqlite3 -header -column andmed.db <<'SQL'
CREATE TABLE students (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  city TEXT
);
INSERT INTO students VALUES
  (1, 'Mari', 'Tartu'),
  (2, 'Jaan', 'Tallinn'),
  (3, 'Liis', 'Narva');
SELECT * FROM students;
SQL

Näed kolme õppijat. Tabeli loomine ja lisamine ise tavaliselt teksti ei väljasta. Ära käivita loomise plokki samas andmebaasis uuesti: tabel on juba olemas. Uueks katseks loo uus ajutine kataloog, mitte ära kustuta seniseid tabeleid.

Struktuuri saad hiljem kontrollida shellist käsuga sqlite3 andmed.db '.schema students'.

Lisa tulemused eraldi tabelisse

Ühel õppijal võib olla mitu tulemust. results.student_id viitab tabeli students.id väärtusele. PRAGMA foreign_keys = ON lülitab viidete kontrolli sisse; SQLite'is tuleb seda teha igas andmeid muutvas ühenduses, kui kontroll pole juba lubatud.


sqlite3 andmed.db <<'SQL'
PRAGMA foreign_keys = ON;
CREATE TABLE results (
  id INTEGER PRIMARY KEY,
  student_id INTEGER NOT NULL,
  subject TEXT NOT NULL,
  score INTEGER NOT NULL,
  FOREIGN KEY (student_id) REFERENCES students(id)
);
INSERT INTO results (student_id, subject, score) VALUES
  (1, 'matemaatika', 91), (1, 'python', 95),
  (2, 'matemaatika', 84), (2, 'python', 79),
  (3, 'matemaatika', 88), (3, 'python', 90);
SQL

Viidete kontroll takistab tulemuse lisamist olematule õppijale. See ei kontrolli automaatselt näiteks punktisumma mõistlikku vahemikku; sellised reeglid tuleb eraldi määrata.

Seo ja koonda

Järgmises päringus on s ja r tabelite lühinimed. ON määrab seose ja ORDER BY tulemuse järjekorra:


sqlite3 -header -column andmed.db "
SELECT s.name, s.city, r.subject, r.score
FROM results r
JOIN students s ON s.id = r.student_id
ORDER BY s.name, r.subject;
"

Näed kuut tulemust koos õppijanimedega. See JOIN jätab välja õppijad, kellel tulemust pole; kõigi õppijate säilitamiseks oleks vaja LEFT JOIN-i.

Keskmiseks rühmita õppija järgi. AVG arvutab keskmise, ROUND(..., 1) ümardab ühe kümnendkohani, AS annab tulemuse veerule nime ja DESC järjestab kahanevalt:


sqlite3 -header -column andmed.db "
SELECT s.name, ROUND(AVG(r.score), 1) AS keskmine
FROM results r
JOIN students s ON s.id = r.student_id
GROUP BY s.id, s.name
ORDER BY keskmine DESC;
"

Tulemused on Mari 93.0, Liis 89.0 ja Jaan 81.5. Päring ei muuda salvestatud hindeid.

Sama andmebaas Pythonist

Salvesta järgmine kood faili naide.py samas kataloogis. Käivita python3 naide.py. Päringu ? on parameetri kohatäitja: kasutaja väärtusi ei liideta SQL-i stringi sisse.


import sqlite3

conn = sqlite3.connect("andmed.db")
try:
    for name, in conn.execute(
        "SELECT name FROM students WHERE city = ?", ("Tartu",)
    ):
        print(name)
finally:
    conn.close()

Näed Mari. SQL valib andmed; Python saab tulemuse edasi töödelda. finally sulgeb ühenduse ka vea korral.

Minitest

  1. Leia kõigi õppijate asemel ainult Tallinna õppija nimi.
  2. Miks ei tohiks seost teha nime järgi, kui kahel õppijal võib olla sama nimi?
  3. Mis muutuks keskmise päringus, kui eemaldada GROUP BY?
  4. Miks ei piisa SQLite'is ainult võõrvõtme kirjutamisest tabeli kirjeldusse?
  5. Muuda Pythoni näites linna parameetrit, jättes SQL-teksti samaks.

Lisalugemine

SQLite'i võõrvõtmete juhend selgitab viidete kontrolli. Üldised viited on andmevormingute ja SQLite'i lisalugemises.

Peatüki täisspikker

Edasijõudnu

Eesmärk

SQLite on sild tekstifailide ja päris andmebaasimõtte vahel: failina lihtne, SQL-i mõttes siiski relatsiooniline andmebaas.

Põhikujud

  • sqlite3 andmed.dbava või loo fail
  • sqlite3 andmed.db '.tables'vaata tabeleid
  • sqlite3 andmed.db '.schema'vaata struktuuri
  • sqlite3 andmed.db 'select * from students limit 5;'piilu ridu
  • sqlite3 andmed.db 'select city, count(*) from students group by city;'koonda read
  • sqlite3 andmed.db 'select s.name, r.score from results r join students s on s.id = r.student_id;'ühenda tabelid
  • python3 naide.pykasuta Pythonist

Olulised mõisted

  • primary keyrea unikaalne id
  • foreign keyviide teise tabelisse
  • JOINseo tabelid
  • GROUP BYkoonda read

Kompileerimine ja käivitamine: shell, Python, C, C++, Go, Rust, Java

Loogika

See peatükk ei ole mõeldud nende keelte õppimiseks, vaid ühe väga praktilise vahe mõistmiseks:

  • mõni fail käivitatakse tõlgendiga otse
  • mõni fail kompileeritakse kõigepealt teise vormi
  • mõni tulemus on natiivne binaar
  • mõni tulemus vajab eraldi käivituskeskkonda või virtuaalmasinat

See teema seob kokku:

  • shebang-rida ja käivitatavad skriptid
  • PATH-i ja käskude leidmise
  • Dockeri ja koostamistööriistad
  • LaTeX-i kompileerimise idee

Kiirülevaade

Eesmärk on mõista, miks eri keelte programmide käivitamine erineb: mõnda tõlgendatakse käivitamise ajal, mõni koostatakse enne eraldi artefaktiks.

Kuju või tööriistMilleksMida tavaliselt näed
tõlgendiga skriptkäivita lähtekood otseprogrammi väljund kohe
kompilaatortee lähtekoodist uus artefaktbinaar või koostamiskataloog
go build, cargojuhi koostamissamme tööriistagakoostamislogi ja väljundfailid
Javakompileeri ja käivita eri sammudena.class failid ja programmi väljund
süntaksi- või kompileerimisvigakäivitus peatub enne tulemustveateade enne programmi tööd

Tüüpilised algaja vead

  • arvatakse, et kõik lähtefailid on otse käivitatavad
  • aetakse segi koostamis- ja käivituskäsk
  • unustatakse vaadata, millised failid pärast koostamist tekkisid

Üks kiire võrdlustabel

KeelLähtefailTüüpiline käivitusMis tekib
Shellhello.shsh hello.sh või ./hello.shtavaliselt eraldi koostamisväljundit ei teki
Pythonhello.pypython3 hello.pylähtefail, mõnikord __pycache__
Chello.c./hello-c pärast kompileerimistnatiivne binaarfail
C++hello.cpp./hello-cpp pärast kompileerimistnatiivne binaarfail
Gohello.gogo run hello.go või ./hello-gonatiivne binaarfail
Rustsrc/main.rscargo run või binaarfail kataloogis target/natiivne binaarfail ja kataloog target/
JavaHello.javajava Hello.class fail, käivitus JVM-is

Shell: skript ja shebang

Shelli näide on kõige lihtsam, sest see on lihtsalt tekstifail, mida loeb shell.


cat > hello.sh <<'EOF'
#!/bin/sh
echo "Tere, maailm!"
echo "Tere, maailm!"
echo "Tere, maailm!"
EOF
chmod +x hello.sh
./hello.sh

Siin:

  • fail on tavaline tekstifail
  • chmod +x lubab selle käivitada
  • shebang #!/bin/sh ütleb, milline shell faili tõlgendab

Teine võimalus on:


sh hello.sh

Siis valid shelli käsurealt ise.

Python: tõlgendatud käivitus

Pythoni näide näeb välja samuti lihtne, aga erinevalt shellist käivitad sa tavaliselt faili Pythoni tõlgendiga.


cat > hello.py <<'EOF'
for _ in range(3):
    print("Tere, maailm!")
EOF
python3 hello.py

Siin:

  • lähtefail jääb tekstifailiks
  • python3 loeb selle sisse ja käivitab
  • tavaliselt ei teki kohe samas mõttes eraldi käivitatavat binaari

C: kompileeri binaariks

C on klassikaline näide keelest, kus lähtekood tuleb kõigepealt kompileerida.


cat > hello.c <<'EOF'
#include <stdio.h>

int main(void) {
    for (int i = 0; i < 3; i++) {
        puts("Tere, maailm!");
    }
    return 0;
}
EOF
cc hello.c -o hello-c
./hello-c

Siin:

  • hello.c on lähtefail
  • cc ... -o hello-c teeb sellest binaari
  • ./hello-c käivitab juba kompileeritud programmi

See on oluline vahe võrreldes shelli või Pythoniga: enne käivitamist tuleb ehitada eraldi käivitatav fail.

C++: sarnane C-ga, aga teise kompilaatoriga


cat > hello.cpp <<'EOF'
#include <iostream>

int main() {
    for (int i = 0; i < 3; i++) {
        std::cout << "Tere, maailm!" << std::endl;
    }
    return 0;
}
EOF
c++ hello.cpp -o hello-cpp
./hello-cpp

Loogika on sama nagu C puhul:

  • lähtekood
  • kompileerimine
  • binaar

Go: lihtne tee ühe binaarini

Go sobib käsureaõppeks hästi, sest koostamise loogika on lihtne.


cat > hello.go <<'EOF'
package main

import "fmt"

func main() {
    for i := 0; i < 3; i++ {
        fmt.Println("Tere, maailm!")
    }
}
EOF
go run hello.go
go build -o hello-go hello.go
./hello-go

Siin on kaks eri tööviisi:

  • go run kompileerib ja käivitab ühe käsuga
  • go build teeb natiivse binaari

Go näitab hästi erinevust käivitamise ja eraldi binaari koostamise vahel.

Rust: koostamistööriist on osa tavalisest töövoost

Rustis kasutatakse väga sageli tööriista cargo.


mkdir -p hello-rust
cd hello-rust
cargo init --bin .
cat > src/main.rs <<'EOF'
fn main() {
    for _ in 0..3 {
        println!("Tere, maailm!");
    }
}
EOF
cargo run
cargo build --release
./target/release/hello-rust

Siin:

  • cargo init --bin . teeb projekti karkassi
  • cargo run ehitab ja käivitab
  • cargo build --release teeb optimeerituma binaari

Rusti näide näitab, et mõnes keeles ei koosne koostamine ainult ühest kompilaatorikäsust, vaid tervest töövoost.

Java: kompileerimine ja eraldi käivituskeskkond

Java on hea kontrast C-le ja Go-le, sest kompileerimine toimub küll enne, aga tulemus ei ole tavaliselt otse natiivne binaar.


cat > Hello.java <<'EOF'
public class Hello {
    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            System.out.println("Tere, maailm!");
        }
    }
}
EOF
javac Hello.java
java Hello

Siin:

  • javac teeb failist Hello.class
  • java Hello käivitab selle JVM-is

See on oluline vahe:

  • C, C++, Go ja Rust annavad sulle tavaliselt natiivse binaari
  • Java annab klassifaili, mida käitab Java käivituskeskkond

Minitest

  1. Tee shelliskript, mis prindib sama rea kolm korda.
  2. Tee sama Pythonis.
  3. Kompileeri väike C programm ja käivita see.
  4. Võrdle go run ja go build käitumist.
  5. Vaata, mis fail tekib pärast javac Hello.java.
  6. Selgita ühe lausega, miks Java erineb C-st käivitamise mõttes.

Peatüki täisspikker

Edasijõudnu

Eesmärk

Erista lähtekoodi, koostatud väljundit ja selle käivitajat. Vali üks paigaldatud tööriistaga keel.

Käsud ja näited

  • sh hello.shtõlgenda POSIX-shelliskript
  • python3 hello.pykäivita Pythoni lähtefail
  • cc hello.c -o hello-ckompileeri C lähtefail käivitatavaks failiks
  • ./hello-ckäivita äsja koostatud C programm
  • c++ hello.cpp -o hello-cppkompileeri C++
  • go build -o hello-go hello.gokoosta Go binaarfail
  • cargo runRust: koosta ja käivita Cargo projekt
  • javac Hello.javaJava: loo baitkoodifail Hello.class
  • java Hellokäivita klass JVM-is, ilma .class-laiendita

LaTeX käsurealt

Loogika

LaTeX on selles raamatus pigem järgmine samm pärast Markdowni, kui tahad jõuda väga hea PDF-väljundini.

See teema on seotud dokumentide koostamise ja vormindamisega, mitte Linuxi põhioskustega.

Kiirülevaade

Eesmärk on teha tekstifailist kvaliteetne PDF, kus vormindus, valemid ja viited on korratavalt ehitatavad.

Käsk või failMilleksMida tavaliselt näed
pdflatex fail.texkompileeri PDF-ikspikk logi ja .pdf fail
xelatex fail.texkasuta tänapäevasemat fonditugepikk logi ja .pdf fail
latexmkkorda vajalikke samme automaatseltmitu kompileerimissammu
.texlähtefailjääb tekstifailiks
.aux, .logabifailidtekivad PDF-i kõrval

Tüüpilised algaja vead

  • eeldatakse, et üks kompileerimiskäik lahendab alati kõik ristviited
  • ehmutakse logi pikkusest, kuigi suur osa sellest on tavapärane koostamisteave
  • muudetakse väljundfaile, kuigi tegelik allikas on .tex

Minimaalne näide


\documentclass{article}
\begin{document}
Tere, maailm!
\end{document}

Salvesta see faili tere.tex ja kompileeri:


pdflatex tere.tex

või:


latexmk -pdf tere.tex

Paigaldus

Näited sõltuvad süsteemist:

Vali ainult üks sinu süsteemile sobiv paigaldustee:

Debianis või Ubuntus:


sudo apt install texlive-latex-base

macOS-is Homebrew kaudu:


brew install --cask basictex

macOS-is piisab sageli basictex-ist. Kui vajad suuremat ja täielikumat LaTeX-i komplekti, kasuta selle asemel mactex-no-gui.


brew install --cask mactex-no-gui

Pakette basictex ja mactex-no-gui ei paigaldata tavaliselt koos.

Minitest

  1. Loo fail tere.tex.
  2. Kompileeri see PDF-iks.
  3. Kontrolli, millised väljundfailid LaTeX tekitab.

Lisalugemine

Selle teema usaldusväärsemad viited leiad lisast Lisa E: usaldusväärsed viited ja lisalugemine.

Peatüki täisspikker

Edasijõudnu

Eesmärk

LaTeX-i mõte on lihtne: lähtetekst jääb tekstifailiks, aga buildist sünnib väga täpselt juhitav PDF.

Põhikujud

  • pdflatex tere.texkompileeri PDF
  • xelatex tere.texparem Unicode tugi
  • latexmk -pdf tere.texkorda vajalikud käigud
  • latexmk -xelatex tere.texxelatex automaatselt
  • ls tere.*vaata abifaile
  • open tere.pdfava tulemus

Olulised failid

  • .texlähtefail
  • .pdftulemus
  • .auxristviidete abi
  • .logkompileerimislogi

Lisa A: kopeeritavad minitestid

Siin on lühikesed, peatükkide kaupa jaotatud kopeeritavad harjutused.

Need plokid on teadlikult lühikesed ja kasutavad juba mõnda varem seletatud lühikuju:

  • ~ tähendab kodukataloogi
  • mkdir -p loob puuduva tee koos vahekataloogidega

Vali katseteks uus tühi kataloog. Kui näitenimi on juba kasutusel, muuda seda; > võib olemasoleva faili üle kirjutada.

Failid ja kataloogid


mkdir -p ~/tmp/test1
cd ~/tmp/test1
touch a.txt b.txt
mkdir kaust
mv b.txt kaust/
ls -la

Kontroll: a.txt on praeguses kataloogis, b.txt peab olema alamkataloogis kaust. Kontrolli teist käsuga ls kaust.

Torud ja suunamine


printf 'üks\nkaks\nkolm\n' | wc -l
printf 'tere\n' > proov.txt
printf 'juurde\n' >> proov.txt
cat proov.txt

Kontroll: esimese käsu vastus on 3; faili lõplik sisu on kaks rida, tere ja juurde.

grep ja sort


printf 'kass\nkoer\nkass\n' > loomad.txt
grep 'kass' loomad.txt
sort loomad.txt | uniq -c

Kontroll: grep annab kaks rida; loendus näitab kaks kassi ja üht koera.

Python ja venv


mkdir -p ~/tmp/venvtest
cd ~/tmp/venvtest
python3 -m venv .venv
source .venv/bin/activate
python -V
deactivate

Kontroll: aktiveeritud keskkonnas peab python -m pip --version viitama .venv-ile. Tee see kontroll enne deactivate käsku; väljumine keskkonda ei kustuta.

Peatüki täisspikker

Referents

Eesmärk

Kontrolli tulemust, mitte ainult käsu edukat käivitumist.

Harjutuse kontroll

  • ls kaustkas liigutatud fail on õiges kohas?
  • cat proov.txtkas vana ja lisatud rida on mõlemad alles?
  • sort loomad.txt | uniq -ckaks kassi, üks koer
  • python -m pip --versionkas aktiivne Python kasutab projekti .venv-i?

Lisa B: spikrite register

Kiirviited tööülesande järgi. Failinimed ja serveriaadressid asenda oma töö omadega; tähenduse ja ohutuse kohta loe vastavat peatükki.

Failid

  • pwd kus ma olen
  • ls -la mida siin näha on
  • ls -lt | head vaata, mis viimati muutus
  • du -ak . | sort -nr | less leia suurimad failid ja kaustad
  • du -k -d 1 . | sort -nr võrdle alamkatalooge, ka peidetuid (Linux/macOS)
  • cp kopeeri
  • mv liiguta või nimeta ümber
  • rm fail kustuta fail prügikastita; kontrolli enne sihti
  • rmdir kaust kustuta tühi kataloog
  • rm -r kaust kustuta kataloog koos sisuga
  • mkdir -p ~/tmp/proov loo puuduva teega harjutuskataloog; olemasolev sisu säilib
  • sha256sum fail arvuta faili räsi
  • find . -name 'muster' otsi faile
  • find . -type f -size +100M otsi suuri faile
  • find . -type f -mtime -7 otsi hiljuti muudetud faile

Tekst

  • cat kuva fail
  • less sirvi faili
  • less sees 78g mine reale 78
  • less-is 25% liigu failis 25% kaugusele
  • tail -f logi.txt jälgi kasvavat logi
  • tail -n 50 logi.txt | less sirvi viimaseid logiridu
  • grep otsi
  • grep -R 'muster' . otsi rekursiivselt tervest puust
  • sort sorteeri
  • uniq -c loenda kõrvutised võrdsed read
  • seq -w 0 99 | pr -5 -t pane numbrid mitmesse veergu
  • seq -w 0 9999 | pr -8 -t -l 1250 tee üks pr loogiline leht

Õigused

  • ls -l vaata õigusi
  • chmod +x fail tee käivitatavaks
  • chown kasutaja:grupp fail muuda omanikku

Võrk

  • ssh host logi sisse
  • scp fail host:/tee/ kopeeri üle võrgu
  • rsync -av allikas/ host:/siht/ sünkroniseeri

Arendus

  • git status
  • git diff
  • git diff --cached
  • git add
  • git commit
  • python3 -m venv .venv
  • python3 -u skript.py näita Pythoni väljundit kohe
  • cat > skript.sh <<'EOF' loo skript mitmerealise sisendi abil
  • cc hello.c -o hello-c kompileeri C programm
  • go build -o hello-go hello.go koosta Go binaarfail
  • cargo run koosta ja käivita Rusti projekt
  • javac Hello.java kompileeri Java klass
  • docker run --rm image käsk
  • docker run --rm -it -v "$PWD":/app -w /app python:3.13-slim bash ava projekt konteineris
  • docker build -t nimi . koosta konteinerkuju (image)
  • docker compose up --build käivita mitme teenuse arenduskomplekt
  • docker compose logs -f app jälgi teenuse logisid
  • docker compose exec app bash sisene töötavasse teenusesse
  • column -s, -t < fail.csv | less -S kuva lihtne CSV tabelina
  • python3 -m json.tool fail.json | less vaata JSON-i loetavalt
  • jq '.voti' fail.json vali JSON-ist välju
  • xmllint --format fail.xml | less vorminda XML loetavaks
  • sqlite3 andmed.db '.tables' kuva SQLite tabelid
  • sqlite3 andmed.db 'select * from tabel limit 5;' kuva paar esimest rida
  • sqlite3 andmed.db 'select a.name, b.score from b join a on a.id=b.a_id;' tee lihtne JOIN

Git: visuaalne spikker

Git-spikker: käsud töövoo järgi
Git-spikker: käsud töövoo järgi

Kaart paigutab käsud töövoogu. Üksikasjad ja katsetatav näide on Giti peatükis.

Ettevaatust: git clean -fd kustutab jälgimata faile, commit --amend kirjutab viimase kirje ümber. Pildil lühendatud -m vajab sõnumit, näiteks git commit -m 'Paranda juhend'. Enne muutmist vaata git status ja git diff --cached.

Repo algus

  • git init loo uus repo praeguses kataloogis
  • git clone URL too olemasolev repo oma arvutisse
  • git config user.name "Nimi" seadista selle repo versioonikirjete autorinimi
  • git config user.email "nimi@example.com" seadista selle repo autori e-post; --global muudaks kasutaja vaikeseadet kõigis repodes
  • git remote -v näita kaugrepo aadresse

Harud

  • git branch näita kohalikke harusid
  • git switch main liigu põhiharule
  • git switch -c parandus loo uus haru ja liigu sinna
  • git branch -d parandus kustuta ühendatud kohalik haru
  • git branch -D parandus kustuta haru jõuga; kasuta ainult siis, kui oled kindel

Kaugrepo

  • git fetch origin too serverist värske info, kuid ära ühenda seda praegusesse harusse
  • git pull --ff-only uuenda kohalik haru ainult siis, kui seda saab teha edasinihkena
  • git push -u origin parandus saada uus haru kaugreposse ja seo see ülesvoolu haruga
  • git push saada juba seotud haru uued versioonikirjed kaugreposse
  • git remote prune origin eemalda kohalikud viited kaugrepo harudele, mida serveris enam pole

Ühendamine ja korrastamine

  • git merge haru ühenda teine haru praegusesse harusse
  • git rebase origin/main tõsta oma praeguse haru versioonikirjed värske põhiharu lõppu
  • git merge --abort katkesta pooleliolev ühendamine
  • git rebase --abort katkesta pooleliolev rebase
  • git rebase --continue jätka rebase'i pärast konflikti lahendamist

Ajalugu ja ülevaatus

  • git log --oneline näita ajalugu lühidalt
  • git log --graph --decorate --all -n 20 näita harude ja siltide paiknemist
  • git show HEAD näita viimast versioonikirjet
  • git diff HEAD võrdle tööpuud viimase versioonikirjega
  • git blame fail näita, millisest versioonikirjest faili read pärinevad

Taaste ja tühistamine

  • git restore fail taasta tööfail vaheala sisust; salvestamata muudatus kaob
  • git restore --staged fail eemalda fail vahealalt, kuid jäta faili sisu alles
  • git revert COMMIT loo uus versioonikirje, mis võtab vana muudatuse tagasi
  • git reflog näita, kus HEAD hiljuti käis
  • git restore --source=COMMIT -- fail taasta tööfail nimetatud versioonikirjest; vaheala ei muutu

Ajutine töö

  • git stash push -m 'kirjeldus' pane jälgitud failide töö kõrvale; -u kaasab ka jälgimata failid
  • git stash list näita kõrvale pandud töid
  • git stash show vaata kõrvale pandud töö kokkuvõtet
  • git stash pop too töö tagasi; eduka rakendamise järel eemalda sahtlist, konflikti korral säilita
  • git stash apply too töö tagasi, kuid jäta see sahtlisse alles

Andme- ja arendusprojektides kasulik

  • git lfs install lülita Git LFS kasutaja jaoks sisse
  • git lfs track '*.psd' määra tulevastele PSD-failidele LFS-reegel; salvesta ka loodud .gitattributes, varasem ajalugu ei teisendu
  • git check-ignore -v fail kontrolli, milline .gitignore reegel faili peidab
  • git diff -- . ':(exclude)*.ipynb' võrdle tööpuu muudatusi, jättes märkmikufailid kõrvale
  • git grep 'muster' otsi jälgitud failidest kiiresti

Käsud, mida ei tasu paanikas käivitada

  • git reset --hard viskab tööpuu ja vaheala muudatused ära
  • git clean -fd kustutab jälgimata failid ja kataloogid
  • git push --force-with-lease kirjutab kaugrepo haru ajalugu ümber
  • git branch -D haru kustutab kohaliku haru ka siis, kui Git peab seda ühendamata tööks

Kui plaanid kasutada mõnda neist käskudest, tee enne git status, loe väljund läbi ja salvesta vajadusel töö koopia eraldi kataloogi.

Loogika

  • käsk1 ; käsk2 käivita käsud järjest
  • | suuna väljund edasi
  • > kirjuta väljund faili; vana sisu kirjutatakse üle
  • >> lisa faili lõppu juurde; ära kirjuta üle
  • 2> kirjuta vead eraldi faili
  • > fail 2>&1 kirjuta nii väljund kui vead samasse faili
  • tee fail näita ekraanil ja kirjuta faili
  • && jätka ainult edu korral
  • || jätka vea korral
  • echo $? kuva eelmise käsu lõpetuskood
  • set -o pipefail ära peida toru sees tekkinud vigu
  • type nimi vaata, kas nimi on alias, sisekäsk või programm
  • command -v nimi vaata, mida shell käivitaks

Protsessid

  • käsk & saada töö taustale
  • ps aux vaata protsesse
  • top või htop jälgi protsesse
  • kill PID lõpeta protsess
  • kill %1 lõpeta shelli töö numbri järgi
  • jobs näita shelli töid
  • Ctrl-c katkesta programmi töö
  • Ctrl-z peata programm ajutiselt
  • bg %1 jätka tööd 1 taustal
  • fg %2 too töö 2 ette
  • wait oota taustatöö lõppemist
  • nohup käsk > fail 2>&1 & jäta töö sessioonist vähem sõltuvaks
  • disown %1 eemalda töö shelli tööde nimekirjast
  • ps aux | sort -nrk 3 | head vaata suurima protsessorikasutusega protsesse
  • ps aux | sort -nrk 4 | head vaata suurima mälukasutusega protsesse

Ajalugu

  • history kuva käsuajalugu
  • history | tail -n 20 kuva viimased ajalookirjed hiljem, kui torud on juba selged
  • alias h='history | tail -n 20' tee ajaloo lühikäsk
  • !! korda eelmist käsku hiljem, kui ajaloo-otseteed on juba tuttavad
  • !n korda ajaloo kirjet numbri järgi
  • !sona korda viimast sobivat käsku

Peatüki täisspikker

Referents

Eesmärk

kõige lühemad meelespead teemade kaupa: failid, tekst, võrk, arendus, loogika ja protsessid

Mida siit leiad

  • Failidliigu ja vaata
  • Tekstloe ja filtreeri
  • Võrkühendu ja kopeeri
  • ArendusGit, Docker, koostamine
  • Loogikatorud ja vead
  • Protsessidtööd ja signaalid

Lisa C: sõnastik ja terminoloogia

Levinud mõistete lühiseletused. Ingliskeelseid vasteid vajad käsurea abi ja dokumentatsiooni lugemisel; täieliku teemade kaupa võrdluse leiad inglise-eesti terminoloogiast.

Üldmõisted

  • terminal: tekstipõhine keskkond, kus käske sisestatakse
  • CLI ehk command-line interface: käsurealiides; viis arvutiga suhelda käske kirjutades
  • GUI ehk graphical user interface: graafiline kasutajaliides; viis arvutiga suhelda akende, nuppude, menüüde ja ikoonide kaudu
  • viip ehk prompt: terminalirea alguses olev tekstiosa, mis näitab, et shell ootab sisestust
  • käsurida: üks konkreetne käsk koos argumentidega
  • shell: käsutõlk, mis loeb käsurida ja käivitab käske
  • käsk: programm või shelli sisseehitatud toiming, mida käsurealt käivitatakse
  • argument: käsule etteantud sisend, näiteks failinimi või muster
  • lipp: käsu valik, tavaliselt kujul -n või --help
  • valik: üldisem nimetus käsu lisakäitumise määramiseks
  • standardsisend ehk stdin: programmi vaikimisi sisendvoog
  • standardväljund ehk stdout: programmi tavaline väljundvoog
  • veaväljund ehk stderr: eraldi väljund vigade ja hoiatuste jaoks
  • puhverdamine ehk buffering: olukord, kus programm kogub väljundi ajutiselt kokku enne, kui selle ekraanile, faili või torusse edasi saadab
  • puhvri tühjendamine ehk flush: puhvri kohene tühjendamine, et väljund jõuaks kohe nähtavale või järgmisse kohta
  • toru: kuju |, millega ühe käsu väljund suunatakse teise käsu sisendiks
  • ümbersuunamine: väljundi või sisendi suunamine faili või mujale
  • lõpetuskood ehk exit code: käsu tulemust kirjeldav kood; tavaliselt tähendab 0 edu

Failid ja süsteem

  • fail: andmeüksus failisüsteemis
  • kataloog: koht, mis sisaldab faile ja teisi katalooge
  • tee ehk path: failini või kataloogini viiv asukoht
  • kodukataloog: kasutaja isiklik põhikataloog, sageli ~
  • bin: käivitatavate programmide katalooginimi; ajalooliselt sõnast binary, näiteks /bin, /usr/bin või ~/bin
  • peidetud fail: tavaliselt punktiga algav fail või kataloog, mida paljud tööriistad vaikimisi ei näita
  • punktiga algav nimi: fail või kataloog nimega nagu .zshrc või .git; seda nimetatakse sageli ka peidetud kirjeks
  • õigused: reeglid, mis määravad lugemise, kirjutamise ja käivitamise
  • omanik: kasutaja, kellele fail kuulub
  • grupp: kasutajate rühm, mille järgi saab õigusi jagada
  • root: süsteemi eriline administraatori kasutaja, kellel on väga laiad õigused
  • sudo: tööriist, millega käivitatakse üks käsk ajutiselt kõrgemate õigustega
  • täitmisõigus: õigus faili käivitada
  • täitmisbitt: faili täidetavust märkiv õiguste osa
  • rekursiivne: tegevus, mis läheb ka alamkataloogidesse ja nende sisu kallale
  • valik -f ehk force: sunnib paljudes käskudes toimingu lõpule või jätab kinnituse küsimata; täpne tähendus sõltub käsust
  • räsi: lühike sõrmejälg, mis kirjeldab faili sisu
  • krüptoräsi: räsi, mida kasutatakse tervikluse kontrolliks, näiteks SHA-256

Shell ja tekstitöötlus

  • globbing: shelli mustrilaiendus kujudele nagu *, ?, []
  • jutumärkidega kaitsmine ehk quoting: erimärkide mõju piiramine jutumärkide abil
  • paomärgiga kaitsmine ehk escaping: ühe märgi erikäitumise väljalülitamine, tavaliselt \ abil
  • shellimuutuja: aktiivse shelli sees hoitav muutuja
  • keskkonnamuutuja: muutuja, mis antakse edasi alamprotsessidele
  • alias: lühinimi mõnele pikemale käsule
  • shelli sisseehitatud käsk ehk sisekäsk (builtin): käsk, mis on shelli enda sees, mitte eraldi programmina kettal
  • reserveeritud sõna ehk keyword: shelli süntaksi osa, näiteks if, then, for, do, done
  • shelli funktsioon: shellis defineeritud käsuplokk, mida saab nimega käivitada
  • regulaaravaldis: mustrikeel tekstis vastete leidmiseks
  • sõne ehk string: märkide jada; sõneliteraal annab selle koodis otseselt kirja
  • filter: käsk, mis loeb ridu ja väljastab neist ainult vajaliku osa

Võrk ja kaugkasutus

  • host: võrgus olev sihtmasin; sageli serveri nimi või aadress
  • server: masin või teenus, kuhu ühendutakse
  • port: numbriline võrgukanal teenuse jaoks
  • SSH: turvaline protokoll kaugmasinasse logimiseks ja käskude käivitamiseks
  • võtmepaar: avaliku ja privaatse võtme paar autentimiseks
  • pordiedastus ehk port forwarding: võrguühenduse suunamine ühest pordist teise
  • WSL ehk Windows Subsystem for Linux: viis käitada Windowsis Linuxi kasutajaruumi

Git ja GitHub

  • repo: Giti hoidla või repositoorium
  • haru: eraldi arendusjoon Gitis
  • commit ehk versioonikirje: loogiline muudatuse salvestus Gitis
  • kaugrepo ehk remote: väline repo, millega kohalik repo suhtleb
  • origin: vaikimisi peamise kaugrepo nimi
  • märgend ehk tag: nimetatud tähis mõne versioonikirje juures
  • väljalase ehk release: teadlikult välja antud versioon, tavaliselt seotud kindla Giti märgendiga (tag)
  • hetktõmmis ehk snapshot: säilitamiseks tehtud väljundikoopia, mida järgmine koostamine üle ei kirjuta
  • verstapost: oluline seis, mis tasub eraldi nime all alles hoida
  • pull request ehk tõmbekutse: GitHubi kaudu esitatud muudatusettepanek harust teise
  • diff: muudatuste vaade enne või pärast versioonikirje loomist
  • vaheala ehk stage: Giti ala, kuhu valitakse järgmisse versioonikirjesse minevad muudatused

Paketid ja arenduskeskkond

  • pakett: paigaldatav tarkvaraüksus või sõltuvus
  • paketihaldur: tööriist pakettide paigaldamiseks, eemaldamiseks ja uuendamiseks
  • sõltuvus: teek või pakett, mida projekt vajab
  • virtuaalkeskkond: eraldatud keskkond projekti sõltuvuste jaoks
  • IDE: integreeritud arenduskeskkond
  • koostamine ehk build: lähtefailidest kasutatava väljundi tekitamine
  • kompileerimine: lähtekoodi või dokumendi tõlkimine teise vormi, näiteks PDF-iks
  • tõlgendaja ehk interpreter: programm, mis loeb lähtekoodi ja käivitab seda otse
  • kompilaator: programm, mis tõlgib lähtekoodi teise vormi, sageli binaariks või baitkoodiks
  • binaar: kompileeritud käivitatav fail masina jaoks
  • baitkood: vahevorm, mida käitab eraldi käivituskeskkond või virtuaalmasin
  • käivituskeskkond ehk runtime: keskkond, mida programm tööks vajab
  • JVM ehk Java virtuaalmasin: keskkond, mis käivitab Java klassifaile ja baitkoodi
  • Homebrew ehk brew: levinud paketihaldur macOS-is
  • PowerShell: Windowsi käsukeskkond ja skriptikeel

Andmed ja andmebaasid

  • CSV: lihtne tabelivorming, kus väljad on tavaliselt komadega eraldatud
  • JSON: võtme-väärtuse ja massiivide vorming, mida kohtab palju API-des ja seadistusfailides
  • XML: märgendipõhine puustruktuuriga vorming
  • relatsiooniline andmemudel: viis kirjeldada andmeid tabelite ja nende seoste kaudu
  • rida: üks kirje tabelis
  • veerg: üks omadus või väli tabelis
  • primaarvõti ehk primary key: väli, mis eristab iga rea teistest
  • võõrvõti ehk foreign key: väli, mis viitab teise tabeli primaarvõtmele
  • JOIN: SQL-i operatsioon, mis seob ridu eri tabelitest
  • skeem: andmebaasi struktuuri kirjeldus, näiteks tabelid, väljad ja seosed

Docker

  • image ehk konteinerkuju (AKITis ka konteinerpakett): valmis konteineri aluskihtide kogum
  • konteiner: konteinerkujust loodud eraldatud käivituskeskkond koos kirjutatava kihiga; võib olla töötav või peatatud
  • registrihoidla ehk registry: koht, kus konteinerkujusid hoitakse ja kust neid alla laaditakse
  • hostitee sidumine ehk bind mount: hostsüsteemi faili või kataloogi sidumine konteineri teega
  • nimega andmeköide ehk named volume: Dockeri hallatav püsiv andmeala
  • arenduskonteiner ehk devcontainer: IDE-ga seotud Dockeri-põhine arenduskeskkond

Dokumendid

  • Markdown: lihtne märgistuskeel tekstidokumentide kirjutamiseks
  • LaTeX: märgistus- ja küljendussüsteem kvaliteetsete dokumentide jaoks
  • PDF: lõppväljund jagamiseks või printimiseks
  • HTML: veebis kuvamiseks sobiv väljund

Peatüki täisspikker

Referents

Eesmärk

leia mõiste tähendus ning tunne ära ingliskeelne vaste dokumentatsioonis

Põhimõisted

  • CLIkäsurida
  • GUIgraafiline liides
  • viip ehk promptootab sisestust
  • shelltõlgendab käske
  • lippkäsu valik
  • repoGiti hoidla

Lisa D: edasised võimalused ja lugejate soovid

Milline päris ülesanne jäi õpiku abil lahendamata? Saada soovitus või murekoht, lisades peatüki lingi, kasutatud süsteemi ja koha, kus takerdusid. Ära lisa paroole, võtmeid ega isikuandmeid sisaldavat logi.

Võimalikud süvendused

VajadusEdasiõppimise teema
Meeskonnas muudatusi kooskõlastadaGiti koodiülevaatus, fork ja upstream, sõltuvad harud
Teha korduvast käsujadast vastupidav tööriistfunktsioonid, argumentide kontroll, ajutised failid ja veakäsitlus
Taastada töö pärast viga või riketversioonidega varundus, eraldi andmekandja ja taastamiskatse
Ajastada Linuxis teenuseidsystemd teenuse ja ajasti koostöö
Viia andmed interaktiivsesse analüüsiR või Jupyter; millal valida shell, SQL või märkmik
Mõista keerukamaid otsingumustreidregulaaravaldiste ülesanderada ja parserite kasutamine

Need on võimalikud jätkuteemad, mitte algaja kohustuslik eelteadmiste loend. Seniste teemade süvendamiseks vaata usaldusväärse lisalugemise kogu.

Peatüki täisspikker

Referents

Eesmärk

vali jätkuteema päris ülesande järgi ja saada konkreetne soovitus

Tugevad järgmised teemad

  • R ja märkmikud (notebook)analüüsi järgmine aste
  • Git järgmine asteharud ja konfliktid
  • Shelliskriptid IIveakindlam loogika
  • Statistika sildandmetöö mõtteviis
  • systemd timeridajastus Linuxis
  • Varukoopiadtaastamine ja kontroll

Lisa E: usaldusväärsed viited ja lisalugemine

See lisa koondab teemade kaupa ametlikud ja usaldusväärsed lisalugemise allikad.

Järjekord on üldiselt selline:

  1. ametlik alustamisjuhend või ülevaade
  2. ametlik teatmik või käsiraamat
  3. standard või spetsifikatsioon
  4. üks pikem ja hea õppematerjal, kui see on laialt tunnustatud

Kui tahad edasi õppida, alusta iga teema esimesest viitest. Kui vajad täpset üksikasja, vaata teatmikku või käsiraamatut.

Shellid ja põhikäsud

  1. GNU Bash Reference Manual
  2. POSIX Shell Command Language
  3. Zsh Documentation
  4. Linux man-pages project
  5. GNU Coreutils Manual

Linux, macOS, Windows ja WSL

  1. Install WSL
  2. Windows Subsystem for Linux Documentation
  3. GNU Bash Reference Manual
  4. Zsh Documentation
  5. Linux man-pages project

SSH ja võrgutööriistad

  1. OpenSSH Manual Pages
  2. curl documentation
  3. GNU Wget Manual
  4. Linux man-pages project

Tekstitöötlus ja filtrid

  1. GNU Grep Manual
  2. GNU sed Manual
  3. GNU gawk Manual
  4. jq Manual
  5. GNU Coreutils Manual

Git ja GitHub

  1. Git documentation
  2. gittutorial
  3. giteveryday
  4. Pro Git

Python ja virtuaalkeskkonnad

  1. Python venv documentation
  2. Install packages in a virtual environment using pip and venv
  3. Python json documentation
  4. Python csv documentation

Docker ja arenduskonteinerid

  1. Docker Docs
  2. Docker Get Started
  3. Docker Get Started: Introduction
  4. Lab: Getting Started with Docker
  5. Developing inside a Container
  6. Create a Dev Container

JSON, CSV, XML ja SQLite

  1. Python json documentation
  2. Python csv documentation
  3. jq Manual
  4. SQLite Documentation
  5. SQLite SELECT reference
  6. Python sqlite3 documentation

LaTeX

  1. LaTeX Documentation
  2. LaTeX Project
  3. LaTeX links and contributed resources
  4. CTAN

Peatüki täisspikker

Referents

Eesmärk

ametlikud käsiraamatud ja alustamisjuhendid shelli, SSH, Giti, Dockeri, JSON-i, SQLite'i ja LaTeX-i jaoks

Edasiõppimise teemad

  • Shellid ja põhikäsudbash, zsh, coreutils
  • SSH ja võrkOpenSSH, curl, wget
  • Git ja GitHubdocs ja Pro Git
  • Dockerget started ja compose
  • JSON, CSV, XML, SQLiteametlikud viited
  • LaTeXprojekt ja CTAN

Lisa F: shelli seadistusfailid Bashi ja zsh jaoks

Seadistusfailist saad uuele shellile anda ajaloo, viiba ja oma lühikäsud. Vali kõigepealt oma shelli põhiseadistus; lisa ühised mugavused ainult üks kord. Kogu faili asendamise asemel täienda olemasolevat seadistust.

Milline shell ja milline fail?

ps -p $$ näitab praegust shelliprotsessi. echo "$SHELL" näitab tavaliselt kontole seadistatud sisselogimisshelli; need võivad erineda.

ShellInteraktiivse seadistuse asukoht
zsh~/.zshrc
Bash~/.bashrc
Bashi sisselogimisshell, sageli macOS-i terminalis~/.bash_profile, mis võib laadida ~/.bashrc

Need on tavapärased asukohad; zsh ZDOTDIR võib seadistuste kataloogi muuta. Bash loeb sisselogimisel esimese olemasoleva faili järjestusest .bash_profile, .bash_login, .profile.

Enne muutmist tee olemasolevast failist koopia. Näiteks zsh puhul:


cp -i ~/.zshrc ~/.zshrc.backup
nano ~/.zshrc

-i küsib enne olemasoleva varukoopia ülekirjutamist. Kui lähtefaili pole, pole ka midagi varundada. Ära käsitle muid lugemis- või õigusevigu tõendina faili puudumisest.

Bashi põhiseadistus

Lisa faili ~/.bashrc ainult read, mida seal veel samaväärsel kujul pole:


HISTSIZE=5000
HISTFILESIZE=10000
HISTCONTROL=ignoredups
shopt -s histappend

PS1='\u@\h:\w\$ '

HISTSIZE piirab mälus hoitavat ajalugu, HISTFILESIZE ajaloofaili suurust. ignoredups väldib vahetult korduvaid kirjeid ning histappend lisab shelli lõppedes ajaloo faili senist sisu asendamata.

Kui kasutad Bashi sisselogimisshellina ja sinu profiil veel .bashrc-d ei laadi, lisa olemasoleva ~/.bash_profile lõppu:


if [ -f "$HOME/.bashrc" ]; then
  . "$HOME/.bashrc"
fi

See kontrollib faili olemasolu ja loeb selle praegusesse shelli. Ära kustuta profiilist muid käivituseks vajalikke ridu.

zsh põhiseadistus

Lisa faili ~/.zshrc:


HISTFILE="$HOME/.zsh_history"
HISTSIZE=5000
SAVEHIST=5000
setopt APPEND_HISTORY
setopt HIST_IGNORE_DUPS

PROMPT='%n@%m:%~%# '

SAVEHIST määrab faili salvestatavate ajalookirjete arvu. Viibas tähendavad %n kasutajat, %m arvutinime, %~ lühendatud tööteed ja %# õigustele vastavat lõpumärki.

Kui tahad eraldi terminalide ajalugu jooksvalt jagada, lisa setopt SHARE_HISTORY. See muudab ka seda, millised käsud ülesnoolega ette tulevad; alguses pole seda vaja.

Ühised lühikäsud

Järgmine plokk sobib nii Bashi kui ka zsh interaktiivsesse seadistusfaili:


alias ll='ls -lh'
alias la='ls -la'
alias ..='cd ..'
alias h='history | tail -n 20'
alias dus='du -k -d 1 . | sort -nr'
alias biggest='du -ak . | sort -nr | head -n 10'
export EDITOR=nano
export LESS='-R'

dus näitab Linuxis ja macOS-is kataloogide mahte ühe taseme kaupa; biggest otsib kogu puust. Mõlemad kaasavad peidetud kataloogid ega peida lugemisvigu. du -d puudumisel kasuta biggest-i.

EDITOR annab seda järgivatele programmidele redaktori eelistuse; vali ainult masinas olemasolev redaktor. LESS=-R lubab lehitsejal kuvada toetatud värvikoode, mitte kõiki terminali juhtkoode.

Valikuliselt võid lisada kinnitust küsivad aliased:


alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -i'

Need on mugavus, mitte varukoopia ega üldine turvagarantii. Alias ei kehti igas skriptis, selle saab vahele jätta ning teised valikud võivad käitumist muuta.

Oma programmide otsingutee

PATH sisaldab katalooge, kust shell programme otsib. Ära asenda tervet väärtust ühe kataloogiga.

Bashis lisa olemasolev ~/bin üks kord:


if [ -d "$HOME/bin" ]; then
  case ":$PATH:" in
    *":$HOME/bin:"*) ;;
    *) PATH="$HOME/bin:$PATH" ;;
  esac
fi
export PATH

case valib mustri järgi haru: esimene ei tee midagi, kui tee juba esineb, teine lisab selle ette.

zsh-s on path massiiv seotud muutujaga PATH; typeset -U eemaldab korduvad kirjed:


typeset -U path
if [ -d "$HOME/bin" ]; then
  path=("$HOME/bin" "${path[@]}")
fi
export PATH

Kataloogi ette lisamine annab selle programmidele eelisjärjekorra. Ära lisa PATH-i juhuslikku allalaadimiste kataloogi.

Arendaja valikulised lisad

Lisa ainult kasutatavate tööriistade lühikäsud:


alias gs='git status --short'
alias gd='git diff'
alias gdc='git diff --cached'
alias gl='git log --oneline --decorate -10'
alias venv='python3 -m venv .venv'
alias va='source .venv/bin/activate'
alias dc='docker compose'
alias json='python3 -m json.tool'
alias serve='python3 -m http.server --bind 127.0.0.1 8000'

serve jagab praeguse kataloogi sisu ainult selle arvuti kaudu. Käivita see katsekataloogis, mitte seal, kus hoiad saladusi. Lõpeta Ctrl-c-ga.

mkcd ühendab kataloogi loomise ja sinna liikumise. Järgmine funktsioon nõuab täpselt üht argumenti; && väldib liikumist, kui loomine ebaõnnestus:


mkcd() {
  if [ "$#" -ne 1 ]; then
    printf 'Kasutus: mkcd kataloog\n' >&2
    return 2
  fi
  mkdir -p "$1" && cd "$1"
}

Funktsiooni kasutatakse näiteks mkcd "$HOME/tmp/uus projekt". return lõpetab funktsiooni, mitte kogu shelli.

Kontroll ja taastamine

Kontrolli oma shelli faili süntaksit enne selle sisselugemist:


bash -n ~/.bashrc

zsh puhul:


zsh -n ~/.zshrc

Vaikne tulemus tähendab, et süntaksiviga ei leitud, mitte seda, et kõik käsud on ohutud. Seejärel loe õige fail sisse: source ~/.bashrc või source ~/.zshrc. source käivitab faili sisu praeguses shellis.

Kui seadistus rikub töö, käivita bash --noprofile --norc või zsh -f. zsh loeb ka sel juhul süsteemi zshenv-faili, kuid jätab kasutaja tavalise interaktiivse seadistuse vahele. Paranda fail redaktoris või taasta ainult oma shelli varukoopia, näiteks cp -i ~/.zshrc.backup ~/.zshrc. Uus tavaline terminaliaken loeb vigase seadistuse uuesti, seega pelgalt uue akna avamine ei pruugi aidata.

Minitest

  1. Võrdle ps -p $$ ja echo "$SHELL" vastust. Kas need peavad kattuma?
  2. Varunda oma seadistus ja lisa üks alias; kontrolli süntaksit ning proovi aliast.
  3. Miks ei piisa käsu rm muutmisest kinnitust küsivaks aliasena?
  4. Kuidas pääsed shelli, kui sinu interaktiivses seadistusfailis on viga?

Peatüki täisspikker

Referents

Eesmärk

Hoia üks baasprofiil oma shellile ja lisa ainult vajalikke aliaseid või funktsioone.

Käsud ja näited

  • ps -p $kontrolli praegu töötavat shelli
  • cp -i ~/.zshrc ~/.zshrc.varutee olemasolevast failist varu; ära kirjuta varu pimesi üle
  • zsh -n ~/.zshrckontrolli zsh süntaksit ilma käivitamata
  • bash -n ~/.bashrckontrolli Bashi süntaksit ilma käivitamata
  • source ~/.zshrckäivita muudetud zsh seadistus praeguses shellis
  • zsh -fava zsh kasutaja rc-faile lugemata
  • bash --noprofile --norcava Bash profiile lugemata

Märgid ja valikud

  • ~/.zshrcinteraktiivse zsh seadistus
  • ~/.bashrcinteraktiivse mitte-login Bashi seadistus
  • ~/.bash_profilelogin-Bash; võib laadida .bashrc
  • PATHprogrammide otsinguteed; järjekord loeb