Komentorivi (Command Line Interface, CLI)

Tämän luennon aluksi käsitellään kurssin kannalta olennaiset paikalliset järjestelmät (verkkolevyasemat), mutta pääaiheena on komentorivityöskentely Linux-ympäristöissä.

Oppimistavoitteet

Tämän luennon jälkeen sinun pitäisi osata:

Hyvää lisämateriaalia ovat Unix-käyttöjärjestelmän alkeita, Windowsin käyttäminen komentotulkin avulla ja Tietokone työvälineenä -kurssin komentorivimateriaali. Hyvä englanninkielinen perusmateriaali on The Unix Shell.

Tee myös harjoitustehtävät.

Vanhat luentovideot

Videot pohjautuvat materiaalin vanhempaan versioon, joten osa niiden yksityiskohdista on korjattu tällä sivulla.

WinSCP-ohjelman käyttäminen ja komentorivin aloitus:

Luennon loppuosa, komentoriviasioita:

Kokeile heti

Voit kokeilla komentoriviä suoraan selaimessasi jslinux-emulaattorilla ilman että mitään voi mennä rikki. Varsinaiset kurssitehtävät tehdään kuitenkin yliopiston palvelimella, koska vain siellä on kotihakemistosi ja www-tilasi.

1. Paikalliset järjestelmät

Tällä kurssilla tarvitset seuraavia:

Huomaa

Palvelut aktivoidaan sso.jyu.fi-palvelussa. Vanhoissa ohjeissa esiintyy myös osoite salasana.jyu.fi; käytä sso.jyu.fi-osoitetta.

2. Mikä on komentorivi (CLI, Command Line Interface)?

Rakenteen voi ymmärtää helpommin ajattelemalla komentoa luonnollisena kielenä:

TeeJotain
TeeJotain Mille
TeeJotain Miten Mille
TeeJotain Miten LähtöTiedosto TuotettuTiedosto

Esimerkiksi cp -r vanha uusi on muotoa ”kopioi, rekursiivisesti, lähde, kohde”.

3. Komentorivi (CLI) vs. graafinen käyttöliittymä (GUI)

Kumpi on parempi käyttöliittymä? Kummassakin on puolensa.
OminaisuusKomentorivi (CLI)Graafinen käyttöliittymä (GUI)
Helppous alussaVaikea oppia, vaatii enemmän muistamistaHelppo oppia, intuitiivisempi
KäyttöliittymäJokaisen ohjelman käyttöliittymä samanlainenKäyttöliittymät erilaisia
LöydettävyysToiminnot pitää tietää etukäteenToiminnot näkyvät valikoissa
NopeusOsaavan käsissä erittäin nopeaHitaahko
KontrolliAntaa laajan kontrollinRajatumpi, ohjelmakohtainen
ResurssitVaatii vähän resurssejaVaatii paljon resursseja
ToistettavuusKomennon voi tallentaa, jakaa ja ajaa uudelleen sellaisenaanKlikkaussarjaa on vaikea dokumentoida tai toistaa
AutomatisointiErittäin helposti skriptattavissaRajatusti mahdollista
EtäkäyttöKevyt, toimii hitaallakin yhteydelläRaskas, vaatii hyvän yhteyden

Graafiset käyttöliittymät tekevät helpoista tehtävistä helppoja; komentorivi tekee vaikeista tehtävistä mahdollisia.

Tehokkainta on käyttää molempia. Komentoriviä ei pidä sekoittaa tekstipohjaiseen käyttöliittymään (TUI), jollainen esimerkiksi nano on.

4. Missä komentoriviin törmää?

Käytämme kurssilla yliopiston Linux-palvelimia, koska kaikilla on niihin pääsy ja käytössä on samanlainen ympäristö.

5. Komentorivin hyötyjä

Tyypillisiä tehtäviä, joissa komentojono säästää tunteja: sadan valokuvan koon muuttaminen, kymmenien videotiedostojen muuntaminen toiseen muotoon, tietyntyyppisten tiedostojen kopiointi www-palvelimelle, varmuuskopiointi ja lokitiedostojen läpikäynti. Näihin palataan kohdassa Komentojonot eli skriptit.

6. Mikä on UNIX?

Jyväskylän yliopistossa opiskelijat saavat tunnuksen Linux-palvelimelle. Yleinen periaate on seuraava:

7. Yhteydenotto palvelinkoneeseen

Unix-käyttöoikeus pitää olla aktivoituna sso.jyu.fi-palvelun kautta. Mitään lisäohjelmia ei tarvitse asentaa: Windowsissa, macOS:ssä ja Linuxissa on nykyään valmiina ssh-ohjelma.

  1. Käynnistä ensin VPN-yhteys, jos käyttämäsi kone ei ole yliopiston verkossa. Kesästä 2024 alkaen SSH-yhteys yliopiston ulkopuolelta vaatii VPN:n.

  2. Käynnistä Windows Terminal tai PowerShell. Macissa ja Linuxissa käynnistä Terminal.

  3. Kirjoita komentoriville seuraava komento (korvaa omatunnus omalla käyttäjätunnuksellasi) ja paina Enter:

    ssh omatunnus@halava.cc.jyu.fi

    Voit ottaa yhteyden myös koneeseen jalava.cc.jyu.fi. Koneet ovat identtiset eikä ole väliä kumpaa käytät.

  4. Ensimmäisellä yhteydenottokerralla SSH haluaa varmistaa koneen luotettavuuden ja pyytää sinua hyväksymään koneen avaimen:

    The authenticity of host 'halava.cc.jyu.fi (130.234.10.217)' can't be established.
    ED25519 key fingerprint is SHA256:KA7t35STwdE6Enj/wY13P+WnCoz9zM8jy2vR+5BpgaY.
    Are you sure you want to continue connecting (yes/no/[fingerprint])?

    Hyväksy avain kirjoittamalla yes ja painamalla Enter.

  5. Syötä salasanasi. Salasana ei näy sitä kirjoitettaessa, ei edes tähtinä. Tämä on normaalia. Paina Enter.

    omatunnus@halava.cc.jyu.fi's password:
    Last login: Tue Aug 26 20:34:00 2025 from vpn-10-1-2-3.jyu.fi
    [omatunnus@halava ~]$
Jos avain on muuttunut

Jos SSH myöhemmällä yhteyskerralla väittää palvelimen avaimen muuttuneen, älä jatka yhteyttä. Muutos voi tarkoittaa, että joku yrittää kaapata yhteytesi ja esiintyä halavana. Palvelimen avain vaihtuu normaalisti vain suuren käyttöjärjestelmäpäivityksen yhteydessä, ja siitä tiedotetaan erikseen.

Oikotie ~/.ssh/config-tiedostolla

Omalla koneellasi olevaan tiedostoon ~/.ssh/config voi tallentaa yhteysasetukset, jolloin pitkän komennon sijaan riittää ssh halava:

Host halava
    HostName halava.cc.jyu.fi
    User omatunnus

Sama lyhenne toimii myös scp- ja rsync-komennoissa: scp index.html halava:html/.

Kopiointi ja liittäminen pääteikkunassa

Ctrl+C ja Ctrl+V ovat päätteessä muussa käytössä, joten leikepöytä toimii eri näppäimillä:

Leikepöytä eri pääteohjelmissa.
OhjelmaKopiointiLiittäminen
Useimmat ohjelmatCtrl+InsertShift+Insert tai hiiren oikea painike
Windows Terminal, PowerShellCtrl+Shift+CCtrl+Shift+V tai hiiren oikea painike
macOS Terminal, iTerm2Cmd+CCmd+V
Linuxin pääteohjelmatCtrl+Shift+CCtrl+Shift+V tai keskipainike
Varo liittämistä

Liitetty teksti menee päätteeseen sellaisenaan. Jos leikepöydällä on monirivinen teksti, kaikki rivit suoritetaan komentoina heti. Älä koskaan liitä nettisivulta komentoa, jota et ymmärrä.

Liite: PuTTY (ei enää tarpeen, mutta osassa vanhoja ohjeita mainittu)

PuTTY oli vuosia tavallisin tapa ottaa SSH-yhteys Windowsista, koska Windowsissa ei ollut omaa ssh-komentoa. Nykyään sitä ei tarvita. Jos käytät PuTTYä, tarkista kohdasta Window → Translation, että merkistöksi on valittu UTF-8, ja tallenna asetus Session → Default Settings → Save. Sanat ”pääte”, ”konsoli” ja ”terminaali” tarkoittavat käytännössä samaa asiaa eli ikkunaa, jossa on komentorivi. Ne ovat peräisin ajalta, jolloin oli olemassa erillisiä päätelaitteita; PuTTY ja Windows Terminal ovat pääte-emulaattoreita, jotka matkivat sellaista.

8. Merkkipohjaisessa järjestelmässä työskentely

Tiedostojen nimeäminen

Käytä tiedostonimissä vain pieniä kirjaimia a–z, numeroita, väliviivaa ja alaviivaa. Vältä välilyöntejä, ääkkösiä (ä, ö, å) ja erikoismerkkejä (&, ?, *, #). Sama sääntö pätee Windowsissa, ja www-julkaisemisessa se on käytännössä pakollinen: nimi päätyy osoiteriville.

Jos saat kirjautumisen jälkeen virheilmoituksen

Could not chdir to home directory /nashome2/omatunnus: Permission denied
-bash: /nashome2/omatunnus/.bash_profile: Permission denied

lähetä kyseinen virheilmoitus IT-palveluihin osoitteeseen palvelupiste@jyu.fi, niin tunnuksesi korjataan toimivaksi.

9. Mitä komentotulkki tekee riville?

Suuri osa komentorivin yllätyksistä selittyy sillä, että komentotulkki muokkaa kirjoittamaasi riviä ennen kuin ohjelma käynnistyy. Ohjelma ei koskaan näe sitä, mitä kirjoitit, vaan sen, mitä shell rivistä teki. Vaiheet ovat karkeasti:

  1. Jako sanoiksi. Rivi pilkotaan välilyöntien kohdalta osiin. Tästä syystä välilyönti tiedostonimessä on ongelma.
  2. Laajennukset. ~ korvataan kotihakemiston polulla, $MUUTTUJA muuttujan arvolla ja *, ? sekä [...] niitä vastaavilla tiedostonimillä.
  3. Lainausmerkkien poisto. Lainaus estää edellisen vaiheen; itse lainausmerkit eivät päädy ohjelmalle asti.
  4. Edelleenohjausten käsittely. >, >> ja | otetaan pois riviltä ja niistä tehdään kytkennät tiedostoihin ja prosesseihin.
  5. Ohjelman etsiminen. Jäljelle jääneen rivin ensimmäistä sanaa etsitään PATH-ympäristömuuttujan kansioista.
  6. Käynnistys. Ohjelma saa loput sanat parametreinaan ja alkaa kirjoittaa vakiotulosteeseen ja virhevirtaan.
Näe vaiheet omin silmin

echo tulostaa sille annetut parametrit. Kun kirjoitat echo suunnittelemasi komennon eteen, näet täsmälleen sen rivin, jonka shell olisi suorittanut. Tämä on materiaalin hyödyllisin yksittäinen vinkki, ja siihen palataan useassa luvussa.

[opiskelija@halava ~]$ echo rm *.txt
rm muistiinpanot.txt tehtava.txt tarkea-raportti.txt

10. Tutustu ympäristöösi

Kokeile seuraavia komentoja. Mikään niistä ei muuta mitään, joten ne ovat turvallisia.

[opiskelija@halava ~]$ whoami
opiskelija
[opiskelija@halava ~]$ hostname
halava.cc.jyu.fi
[opiskelija@halava ~]$ uname -nmo
halava.cc.jyu.fi x86_64 GNU/Linux
[opiskelija@halava ~]$ pwd
/nashome3/opiskelija
[opiskelija@halava ~]$ date
to 27.8.2026 09.14.02 +0300
[opiskelija@halava ~]$ who
opiskelija pts/0        2026-08-27 09:12 (vpn-10-1-2-3.jyu.fi)
Ympäristöä tutkivat komennot.
KomentoKertoo
whoamiKäyttäjätunnuksesi
hostnameKoneen nimen (kumpi, halava vai jalava?)
uname -nmoKoneen nimen, laitearkkitehtuurin ja käyttöjärjestelmän
pwdOletushakemistosi absoluuttisen polun
whoKetkä ovat kirjautuneina koneelle
echo $SHELLKäytössä olevan komentotulkin polku ja nimi

11. Tab-täydennys ja komentohistoria

Nämä ominaisuudet tekevät komentorivistä kätevämmän. Opettele ne heti, ennen kuin totut kirjoittamaan kaiken käsin.

Sarkain täydentää nimet

Kun olet kirjoittanut komennon tai tiedostonimen alun, paina Tab. Komentotulkki täydentää nimen, jos se on yksikäsitteinen. Jos vaihtoehtoja on useita, toinen Tab-painallus listaa ne.

[opiskelija@halava ~]$ cd ht[Tab]
[opiskelija@halava ~]$ cd html/

[opiskelija@halava html]$ ls te[Tab][Tab]
testi.html  testikuva1.png  testikuva2.png

Tab-täydennys ei ole vain nopeampi vaan myös turvallisempi: se ei täydennä olemattoman tiedoston nimeä, joten kirjoitusvirheet paljastuvat ennen komennon suorittamista.

Komentohistoria

Aiempien komentojen käyttäminen uudelleen.
NäppäilyToiminto
ja Selaa edellisiä komentoja
Ctrl+RKäänteinen haku historiasta: kirjoita osa komennosta, toinen Ctrl+R etsii vanhemman osuman, Enter ajaa, Ctrl+G peruu
historyListaa komennot numeroituna
history | grep chmodEtsii historiasta tietyn komennon
!!Toistaa edellisen komennon
!42Toistaa historian komennon numero 42
!$Edellisen komennon viimeinen parametri
[opiskelija@halava ~]$ mkdir html/kuvat
[opiskelija@halava ~]$ cd !$
cd html/kuvat
[opiskelija@halava kuvat]$
Salasanat eivät kuulu historiaan

Komentohistoria tallentuu tiedostoon ~/.bash_history. Älä kirjoita salasanoja tai API-avaimia komentoriville parametreina, koska ne jäävät sinne talteen ja näkyvät hetken myös muille käyttäjille ps-listauksessa.

12. Merkinnät, pikanäppäimet ja erikoismerkit

Bash-ympäristön tärkeimmät pikanäppäimet

Huomaa, että Ctrl+C, Ctrl+D ja Ctrl+Z eivät tee sitä mitä muissa ohjelmissa.
NäppäinyhdistelmäToiminto
TabTäydentää komentojen ja tiedostojen nimiä
Ctrl+ASiirry rivin alkuun
Ctrl+ESiirry rivin loppuun
Ctrl+UPoistaa rivin kursorin kohdasta alkuun
Ctrl+KPoistaa rivin kursorista eteenpäin
Ctrl+WPoistaa kursoria edeltävän sanan
Ctrl+LPuhdistaa näytön (sama kuin clear)
Ctrl+RKäänteinen haku komentohistoriasta
Ctrl+CLähettää etualan ohjelmalle keskeytyssignaalin (SIGINT). Useimmat ohjelmat lopettavat siihen, mutta ohjelma voi myös käsitellä signaalin itse eikä siis välttämättä lopeta
Ctrl+DLähettää tiedoston lopun (EOF). Tyhjällä rivillä tämä lopettaa shell-istunnon kuten exit; muuten se päättää ohjelmalle syötettävän tekstin
Ctrl+ZPysäyttää etualan ohjelman (suspend). Ohjelma ei jatka ajoaan ennen kuin annat komennon fg (jatka etualalla) tai bg (jatka taustalla)
Ctrl+SPysäyttää päätteen tulostuksen. Näyttää siltä kuin kone olisi jumissa
Ctrl+QVapauttaa päätteen Ctrl+S:n jälkeen
Kolme yleistä väärinkäsitystä

Erikoismerkit

Osa komennoissa tarvittavista merkeistä on suomalaisella näppäimistöllä hankalasti löydettävissä ja muistuttaa toisiaan paperilla.

Shellissä tarvittavat erikoismerkit suomalaisella näppäimistöllä.
MerkkiNimi ja näppäily
~Tilde, aaltoviiva, ”mato”. AltGr+¨ ja sen jälkeen välilyönti. Kyseessä on aksenttimerkki, joka odottaa seuraavaa merkkiä
^Sirkumfleksi, ”hattu”, caret. Shift+¨ ja välilyönti
|Pystyviiva, putkimerkki. AltGr+< (vasen alakulma)
\Kenoviiva. AltGr++
{ ja }Aaltosulkeet. AltGr+7 ja AltGr+0
[ ja ]Hakasulkeet. AltGr+8 ja AltGr+9
$Dollari. AltGr+4
"Lainausmerkki, double quote. Shift+2
'Heittomerkki, single quote, apostrofi. Näppäin ä:n oikealla puolella
`Gravis, back-tick. Shift+´ ja välilyönti. Varo, ettei tule akuuttia ´

13. Selailu: less ja man

Kun tuloste on näyttöä pidempi, se selataan less-ohjelmalla. Sama ohjelma näyttää myös manuaalisivut. Tästä ohjelmasta poistutaan q-näppäimellä, ei Ctrl+C:llä eikä sulkemalla ikkuna. Tämä on kurssin yleisin jumitilanne.

Perusnavigointi less-ohjelmassa ja siis myös man-sivuilla.
NäppäinToiminto
qPoistuminen
VälilyöntiSivu eteenpäin
bSivu taaksepäin
ja Rivi kerrallaan
/hakusanaEtsi eteenpäin
n ja NSeuraava ja edellinen osuma
g ja GAlkuun ja loppuun
hOhje

14. Ongelmatilanteet

”Painelen näppäimiä, mutta mitään ei tapahdu”

Tärkeintä on olla menemättä paniikkiin. Näppäimiä ja varsinkaan Enteriä ei kannata hakata, koska puskuriin kertyneet painallukset suoritetaan myöhemmin. Käy läpi järjestyksessä:

  1. Onko ikkuna aktiivinen? Klikkaa pääteikkunaa.
  2. Tuliko vahingossa Ctrl+S? Paina Ctrl+Q.
  3. Odottaako jokin ohjelma yhä syötettä? Katso, näkyykö ruudulla kehote vai jokin muu. Kokeile q (less, man), Ctrl+D (syötteen loppu) tai Ctrl+C (keskeytys).
  4. Kestääkö ajo kauan? Odota hetki. Jos et halua odottaa, Ctrl+C.
  5. Onko verkkoyhteys poikki? Avaa uusi pääteyhteys ja katso, toimiiko se. Jos halava ei vastaa, kokeile jalavaa.

”Komennot menevät läpi, mutta en näe mitä kirjoitan”

Pääte on sekaisin, tyypillisesti siksi että jokin ohjelma kaatui kesken näyttötilan vaihdon. Kokeile järjestyksessä:

[opiskelija@halava ~]$ reset
[opiskelija@halava ~]$ stty sane

Komennot eivät ehkä näy kirjoittaessasi, mutta ne toimivat. Jos ei auta, sulje yhteys ja avaa uusi.

”Kaikki on jumissa”

Joistain ohjelmista on vaikea poistua, jos ei tiedä miten. Tunnetuin on vi-editori, josta pääsee ulos painamalla järjestyksessä Esc, :, q, !, Enter.

Poistuminen tavallisimmista ohjelmista.
OhjelmaPoistuminen
less, man, moreq
nanoCtrl+X
vi, vimEsc :q! Enter
topq
python3, sqlite3Ctrl+D tai exit()
Yleinen keskeytysCtrl+C; monissa ohjelmissa Ctrl+G on peruuta

Taustalle mahdollisesti jääneet ohjelmat voi lopettaa kill-komennolla.

15. Virheilmoitusten tulkinta

Unixin virheilmoitukset ovat lyhyitä mutta täsmällisiä. Kun opit lukemaan viisi yleisintä, selviät useimmista tilanteista ilman apua. Ilmoituksen muoto on tavallisesti ohjelma: kohde: syy.

Yleisimmät virheilmoitukset ja niiden aiheuttajat.
VirheilmoitusMitä se tarkoittaaMitä tehdä
bash: mkdri: command not found Komentotulkki ei löytänyt mkdri-nimistä ohjelmaa PATH-kansioista Tarkista kirjoitusasu. Jos komento on oma ohjelmasi, käynnistä se muodossa ./ohjelma tai lisää kansio PATHiin
ls: cannot access 'kuvat': No such file or directory Annettua polkua ei ole olemassa siitä hakemistosta katsottuna, jossa olet Aja pwd ja ls. Muista, että isot ja pienet kirjaimet ovat eri asia. Tarkista suhteellinen viittaus komennolla realpath
-bash: ./skripti.sh: Permission denied Tiedostolla ei ole suoritusoikeutta, tai hakemistolta puuttuu x chmod u+x skripti.sh. Katso luku 29
cp: omit directory 'kuvat' Yritit kopioida hakemiston ilman rekursiovipua cp -r kuvat kohde/
cp: cannot create regular file 'foo/': Not a directory Kohde foo/ ei ole hakemisto, vaikka luulit sen olevan ls -ld foo ja realpath foo
rmdir: failed to remove 'kuvat': Directory not empty rmdir poistaa vain tyhjän hakemiston Tyhjennä ensin, tai käytä harkiten rm -r
bash: kuva.jpg: command not found Kirjoitit tiedostonimen ilman komentoa Kerro, mitä tiedostolle pitäisi tehdä: cat, less, nano
> uudella rivillä, kehote ei palaa Lainausmerkki jäi sulkematta; shell odottaa rivin jatkoa Ctrl+C ja kirjoita komento uudelleen
Disk quota exceeded Levykiintiösi on täynnä quota -s ja du -sh * | sort -h. Katso luku 21
Lue ilmoitus loppuun

Aloittelijan tavallisin virhe on ohittaa virheilmoitus silmäilemällä. Ilmoitus kertoo lähes aina sekä kohteen että syyn. Jos ilmoitus on englanniksi eikä sana aukea, kokeile hakea sitä sellaisenaan hakukoneesta lainausmerkeissä.

16. Hakemistot ja navigointi

Kaikissa seuraavissa esimerkeissä käytetään samaa harjoitushakemistopuuta, jonka voit luoda itsellesi seuraavassa luvussa.

Harjoitushakemistopuu kansionäkymänä Kotihakemiston (~) sisällä on hakemisto tyovaline. Sen sisällä ovat hakemistot demot ja luennot sekä tiedosto testi.txt. Hakemiston demot sisällä ovat hakemistot demo1, demo2 ja demo3, ja demo3:n sisällä on tiedosto virukset.txt. Hakemiston luennot sisällä ovat hakemistot luento1, luento2 ja luento3. ~ kotihakemisto tyovaline demot demo1 demo2 demo3 virukset.txt luennot luento1 luento2 luento3 testi.txt ~/tyovaline/demot/demo3 ~/tyovaline/testi.txt
Harjoitushakemistopuu kansionäkymänä. Kolmio osoittaa avatun hakemiston, ja katkoviiva yhdistää hakemiston sen sisältöön. Oikealla näkyy kahden kohteen absoluuttinen polku.

Kotihakemisto

Käyttäjän kotihakemisto on kansio, joka on oletuskansionasi heti sisäänkirjautumisen jälkeen. Se merkitään tildellä eli matomerkillä (~). Suoraan kotihakemistoon pääsee aina pelkällä komennolla cd ilman parametreja.

Oletushakemisto

Oletushakemisto eli työhakemisto (.) on se kansio, jossa paraikaa toimit. Komento pwd kertoo, missä olet. Kun komennolle ei anneta polkua, se kohdistuu oletushakemistoon: ls ja ls . tekevät saman asian.

Isähakemisto

Isähakemisto (..) on hakemistopuussa yhden tason ylempänä. Esimerkissä luento1-kansion isähakemisto on luennot, ja luento1 on luennot-kansion alikansio.

Liikkuminen cd-komennolla

Kauttaviiva (/) on kansioerotin. Windowsissa vastaava merkki on kenoviiva (\).

[opiskelija@halava ~]$ cd tyovaline
[opiskelija@halava tyovaline]$ cd demot/demo3
[opiskelija@halava demo3]$ pwd
/nashome3/opiskelija/tyovaline/demot/demo3
[opiskelija@halava demo3]$ cd ../../luennot/luento2
[opiskelija@halava luento2]$ cd
[opiskelija@halava ~]$
cd-komennon pikavalinnat.
KomentoVaikutus
cdKotihakemistoon
cd ~Kotihakemistoon (sama asia)
cd ..Yksi taso ylös
cd ../..Kaksi tasoa ylös
cd -Takaisin edelliseen hakemistoon, jossa olit
cd /Koko tiedostojärjestelmän juureen

17. Harjoitusympäristön luominen

Luo esimerkkien hakemistopuu itsellesi, jotta voit ajaa materiaalin komennot oikeasti. Kopioi ja liitä koko alla oleva komento kerralla. Se luo hakemistot ja muutaman harjoitustiedoston kotihakemistosi tyovaline-kansioon eikä koske mihinkään muuhun.

[opiskelija@halava ~]$ mkdir -p ~/tyovaline/demot/demo{1,2,3} ~/tyovaline/luennot/luento{1,2,3}
[opiskelija@halava ~]$ cd ~/tyovaline
[opiskelija@halava tyovaline]$ echo "Harjoitustiedosto" > testi.txt
[opiskelija@halava tyovaline]$ echo "Toinen tiedosto" > demot/demo3/virukset.txt
[opiskelija@halava tyovaline]$ ls -R

Aaltosulkeiden sisällä oleva luettelo demo{1,2,3} on aaltosulkulaajennus: komentotulkki monistaa siitä kolme nimeä demo1 demo2 demo3. Vipu -p saa mkdir-komennon luomaan myös puuttuvat välitason hakemistot. Voit tarkistaa laajennuksen tuloksen etukäteen echo-komennolla:

[opiskelija@halava ~]$ echo mkdir -p ~/tyovaline/demot/demo{1,2,3}
mkdir -p /nashome3/opiskelija/tyovaline/demot/demo1 /nashome3/opiskelija/tyovaline/demot/demo2 /nashome3/opiskelija/tyovaline/demot/demo3

Jos tree-ohjelma on asennettuna, tree ~/tyovaline näyttää puun havainnollisesti. Muuten käytä komentoa ls -R ~/tyovaline.

[opiskelija@halava ~]$ tree ~/tyovaline
/nashome3/opiskelija/tyovaline
├── demot
│   ├── demo1
│   ├── demo2
│   └── demo3
│       └── virukset.txt
├── luennot
│   ├── luento1
│   ├── luento2
│   └── luento3
└── testi.txt

6 directories, 2 files
Harjoitus 1

Siirry hakemistoon demo2 käyttäen yhtä ainoaa cd-komentoa kotihakemistostasi. Tarkista sijaintisi pwd-komennolla. Palaa sitten kotiin ilman että kirjoitat mitään polkua.

18. Suhteellinen viittaus

Suhteellinen viittaus lukee polun oletushakemistosta alkaen. Sama suhteellinen viittaus osoittaa siis eri kohteeseen riippuen siitä, missä olet.

Kuvitellaan, että oletushakemisto on demot. Silloin luento2-kansioon viitataan näin:

[opiskelija@halava demot]$ cd ../luennot/luento2
[opiskelija@halava luento2]$

Jos oletushakemisto olisikin demo1, sama viittaus ei enää toimi vaan se pitää mukauttaa uuteen sijaintiin:

[opiskelija@halava demo1]$ cd ../luennot/luento2
bash: cd: ../luennot/luento2: No such file or directory
[opiskelija@halava demo1]$ cd ../../luennot/luento2
[opiskelija@halava luento2]$

Lyhin mahdollinen suhteellinen viittaus on pelkkä samassa kansiossa olevan tiedoston tai kansion nimi.

Vinkki: realpath

Jos tuntuu epäselvältä, mihin kirjoittamasi suhteellinen viittaus oikeasti osoittaa, käytä komentoa realpath, joka muuntaa suhteellisen viittauksen absoluuttiseksi. Sillä voi tarkistaa viittauksen etukäteen tai selvittää jälkikäteen, minne pieleen mennyt komento osoitti.

[opiskelija@halava tyovaline]$ realpath .
/nashome3/opiskelija/tyovaline
[opiskelija@halava tyovaline]$ cd demot
[opiskelija@halava demot]$ realpath ..
/nashome3/opiskelija/tyovaline
[opiskelija@halava demot]$ realpath ../luennot/luento2
/nashome3/opiskelija/tyovaline/luennot/luento2

Harjoittele työkalulla

Kurssin relativetool-työkalulla voit napsauttaa hakemistopuusta kohteen ja nähdä heti, millainen suhteellinen viittaus siihen osoittaa. Kokeile ensin arvata viittaus itse ja tarkista vasta sitten. Sama työkalu havainnollistaa myös absoluuttisia viittauksia.

Jos työkalu ei näy yllä, avaa se omaan välilehteensä: Suhteellinen osoite. Lisää esimerkkejä on sivulla Viittaukset.

Harjoitus 2

Valitse työkalusta jokin syvällä puussa oleva tiedosto ja kirjoita muistiin sen suhteellinen viittaus. Vaihda sitten lähtökansiota ja päättele, miten viittaus muuttuu, ennen kuin katsot vastauksen. Toista pari kertaa, kunnes ..-merkintöjen määrä alkaa tuntua ennakoitavalta.

19. Absoluuttinen viittaus

Absoluuttinen viittaus alkaa kiinteästä, oletushakemistosta riippumattomasta paikasta ja toimii siksi aina samanlaisena. Unix-koneissa aloituspaikkana on joko koko tiedostojärjestelmän juuri / tai käyttäjän oma kotihakemisto ~.

[opiskelija@halava demot]$ cd ~/tyovaline/luennot/luento2
[opiskelija@halava luento2]$ cd ~/tyovaline/demot/demo1
[opiskelija@halava demo1]$ cd ~/tyovaline/luennot/luento2
[opiskelija@halava luento2]$

Sama viittaus toimi molemmista lähtöpaikoista, koska polun aloituspaikka on vakio.

Suhteellinen vai absoluuttinen?
TilanneSuositus
Liikut lähellä nykyistä sijaintiasiSuhteellinen: lyhyempi kirjoittaa
Kirjoitat skriptiä, joka voi käynnistyä mistä tahansaAbsoluuttinen: ei riipu sijainnista
Jaat komennon ohjeessa tai sähköpostissaAbsoluuttinen: toimii lukijalla samoin
Viittaat www-sivuilla saman projektin tiedostoihinSuhteellinen: sivusto toimii myös siirrettynä

Myös edellisen luvun relativetool-työkalu näyttää valitsemasi kohteen absoluuttisen osoitteen, joten voit verrata kahta esitystapaa rinnakkain.

Sama jako toistuu webissä

Suhteellinen ja absoluuttinen viittaus eivät ole vain komentorivin asia. Täsmälleen sama erottelu koskee www-sivujen osoitteita: ../kuvat/logo.png luetaan siitä kansiosta, jossa näytettävä sivu sijaitsee, kun taas https://appro.mit.jyu.fi/images/logo.png osoittaa aina samaan paikkaan. Osoitteissa on lisäksi kolmas muoto, kauttaviivalla alkava puoliabsoluuttinen osoite. Näihin palataan tarkemmin www-sivujen yhteydessä; nyt riittää huomata, että tässä luvussa opittu ajattelutapa siirtyy suoraan selaimen puolelle.

Harjoitus 3

Siirry hakemistoon luento3. Kirjoita ennen kuin painat Enteriä muistiin, mihin viittaus ../../demot/demo2 osoittaa. Tarkista arvauksesi komennolla realpath ../../demot/demo2.

20. Tiedostojen ja hakemistojen käsittely

Perustoiminnot. Kaikki hyväksyvät sekä suhteellisia että absoluuttisia viittauksia.
KomentoToiminto
mkdir kuvatLuo hakemiston
mkdir -p a/b/cLuo koko puun, myös puuttuvat välitasot
touch uusi.txtLuo tyhjän tiedoston tai päivittää olemassa olevan aikaleiman
cp lahde kohdeKopioi tiedoston
cp -r kansio kohde/Kopioi hakemiston sisältöineen
mv vanha uusiSiirtää tai nimeää uudelleen
rm tiedostoPoistaa tiedoston pysyvästi
rmdir kansioPoistaa tyhjän hakemiston
rm -r kansioPoistaa hakemiston sisältöineen pysyvästi

Kopiointi

cp-komennolle kerrotaan lähde ja kohde. Kohde voi olla uusi tiedostonimi tai hakemisto.

Sama kansio, uusi nimi:
[opiskelija@halava demo3]$ cp virukset.txt dokkari.txt

Toinen kansio, sama nimi:
[opiskelija@halava demo3]$ cp dokkari.txt ../demo1/

Toinen kansio, uusi nimi:
[opiskelija@halava demo3]$ cp dokkari.txt ../demo1/virus.txt

Muualta oletushakemistoon:
[opiskelija@halava demo3]$ cp ../../testi.txt .

Muualta muualle, absoluuttisella viittauksella:
[opiskelija@halava demo3]$ cp ~/tyovaline/testi.txt ~/tyovaline/luennot/luento2/

Sekaisin suhteellista ja absoluuttista:
[opiskelija@halava demo3]$ cp ~/tyovaline/testi.txt ../../luennot/luento2/

Poistaminen: lue tämä ennen ensimmäistä rm-komentoa

rm on peruuttamaton

Komentorivillä ei ole roskakoria. rm poistaa tiedoston lopullisesti, eikä kumoamistoimintoa ole. Palvelimen varmuuskopiot ovat ainoa mahdollisuus, ja niiden palauttaminen vaatii yhteydenoton IT-palveluihin.

Ennen kuin poistat jokerimerkeillä, tarkista aina ensin, mihin merkit osuvat:

[opiskelija@halava ~]$ ls *.txt        # katso ensin
[opiskelija@halava ~]$ rm *.txt        # poista vasta sitten

Kaksi erityisen vaarallista virhettä:

Turvallisempi tapa harjoitella on rm -i, joka kysyy jokaisesta tiedostosta erikseen.

Sama koskee ylikirjoittamista

cp ja mv korvaavat kohdetiedoston varoittamatta. Vipu -i saa ne kysymään ensin, ja -n estää ylikirjoittamisen kokonaan. Jos haluat varmistuksen aina, katso aliakset kohdan ”Komentojonot eli skriptit” lopussa.

21. Tiedostojen katselu ja levytilan tarkistus

Tiedoston sisällön ja koon tutkiminen.
KomentoToiminto
cat tiedostoTulostaa koko sisällön kerralla. Sopii lyhyille tiedostoille
less tiedostoSelaa sisältöä sivu kerrallaan. Poistu q:lla
head -n 20 tiedostoEnsimmäiset 20 riviä
tail -n 20 tiedostoViimeiset 20 riviä
tail -f loki.txtSeuraa tiedoston loppua reaaliajassa. Erinomainen lokien katseluun. Poistu Ctrl+C
wc -l tiedostoLaskee rivit; -w sanat, -c tavut
file tiedostoArvaa tiedostotyypin sisällön perusteella, ei päätteen
diff a.txt b.txtNäyttää tiedostojen erot
sort, uniqJärjestävät rivit ja poistavat peräkkäiset kaksoiskappaleet
Älä käytä cat-komentoa binääritiedostoihin

cat kuva.jpg syytää päätteeseen satunnaisia ohjausmerkkejä ja sekoittaa sen. Jos näin käy, korjaa tilanne komennolla reset. Tarkista epäselvä tiedosto ensin komennolla file.

Levytila ja kiintiö

Yliopiston kotihakemistossa on levykiintiö. Kun se täyttyy, tiedostojen tallentaminen epäonnistuu ja myös www-sivujen päivittäminen lakkaa toimimasta, usein ilman selvää selitystä.

[opiskelija@halava ~]$ quota -s
[opiskelija@halava ~]$ du -sh ~/*
[opiskelija@halava ~]$ du -sh ~/* | sort -h | tail -n 5
[opiskelija@halava ~]$ df -h .

du -sh kertoo kunkin kohteen viemän tilan ihmisluettavassa muodossa (-h, human readable). Putkittamalla se komennoille sort -h ja tail saat esiin viisi eniten tilaa vievää kohdetta.

22. Manuaalit

Kukaan ei muista kaikkia komentoja ulkoa eikä varsinkaan kaikkia niiden vipuja. Unixissa on man-komento, jolla voi lukea komentojen ohjesivut. Manuaalisivu avautuu less-ohjelmaan, joten poistuminen tapahtuu q-näppäimellä.

[opiskelija@halava ~]$ man ls          # ls-komennon manuaali
[opiskelija@halava ~]$ man -k www      # etsi avainsanaan liittyvät sivut
[opiskelija@halava ~]$ ls --help       # useimmilla ohjelmilla on myös lyhyt ohje
[opiskelija@halava ~]$ man 5 crontab   # tietty manuaalin osa, tässä tiedostomuoto
Näin luet manuaalisivua

Manuaalisivut ovat tiiviitä eikä niitä ole tarkoitettu luettavaksi alusta loppuun. Käytännössä hyödyllisin osa on EXAMPLES aivan lopussa. Hyppää sinne painamalla G ja selaa ylöspäin. Tietyn vivun merkityksen löydät hakemalla: paina /, kirjoita esimerkiksi -r ja paina Enter.

23. Tekstieditori nano

Yksinkertaisin Unix-ympäristöistä löytyvä tekstieditori on nano. Se avataan antamalla muokattavan tiedoston nimi parametrina. Jos tiedostoa ei ole, se luodaan tallennettaessa.

[opiskelija@halava html]$ nano index.html

Ikkunan yläreunassa näkyy nanon versionumero ja muokattavan tiedoston nimi, keskellä on tekstikenttä ja alareunassa yleisimmät komennot. Komennot on merkitty hattumerkillä ^, joka tarkoittaa Ctrl-näppäintä; merkintä M- tarkoittaa Alt-näppäintä.

  GNU nano 5.6.1                    index.html

<h1>Etusivu</h1>

^G Ohje      ^O Kirjoita  ^W Etsi      ^K Leikkaa   ^T Suorita   ^C Sijainti
^X Lopeta    ^R Lue tied. ^\ Korvaa    ^U Liitä     ^J Tasaa     ^/ Rivinro
Nanon tärkeimmät näppäimet. Alapalkin sanamuodot vaihtelevat version ja kieliasetuksen mukaan.
NäppäilyToiminto
Ctrl+OTallenna (WriteOut). Kysyy tiedostonimen; hyväksy Enterillä
Ctrl+XPoistu. Kysyy tallennuksesta, jos muutoksia on
Ctrl+WEtsi merkkijonoa; Alt+W etsii seuraavan
Ctrl+KLeikkaa rivi. Peräkkäiset painallukset keräävät useita rivejä
Ctrl+ULiitä leikatut rivit kursorin kohdalle
Alt+UKumoa (undo); Alt+E tee uudelleen
Ctrl+/Siirry riville numero
Ctrl+GOhje
Ctrl+CNäyttää kursorin sijainnin. Muiden toimintojen aikana peruuttaa aloitetun toiminnon
Ctrl+JTasaa kappaleen eli järjestelee rivinvaihdot uudelleen. Varo tätä HTML- ja koodi​tiedostoissa
Hyödyllinen vipu

nano -l index.html näyttää rivinumerot, mikä helpottaa virheilmoitusten paikantamista. Halutessasi voit tehdä asetuksesta pysyvän lisäämällä rivin set linenumbers tiedostoon ~/.nanorc.

Monipuolisempia editoreita ovat Emacs ja Vim. Molempien opetteluun kannattaa varata aikaa; niistä ei pääse ulos arvaamalla. Vimin sisäänrakennettu harjoituskurssi käynnistyy komennolla vimtutor.

24. Korvausmerkit eli globit

Usein sama toimenpide halutaan tehdä monelle tiedostolle. Kaikkien nimien luetteleminen olisi vaivalloista, joten käytetään korvausmerkkejä (jokerimerkit, wildcards). Näiden käyttöä sanotaan globbaukseksi.

Tiedostonimien korvausmerkit.
MerkkiVastaaEsimerkki
*Nollaa tai useampaa mitä tahansa merkkiäls *.png listaa kaikki png-tiedostot
?Yhtä mitä tahansa merkkiäls ???.txt listaa kolmikirjaimiset txt-tiedostot
[abc]Yhtä listan merkeistäls kuva[123].jpg
[a-z]Yhtä merkkiä väliltäls luento[1-3]/
{a,b}Vaihtoehtoja; toimii myös olemattomille nimillemkdir demo{1,2,3}

Tällä kurssilla riittää, että ymmärrät merkit * ja ?.

Tarkista aina echolla

Koska komentotulkki laajentaa korvausmerkit ennen komennon suorittamista, echo näyttää täsmälleen sen, mitä komento tulee saamaan.

[opiskelija@halava tyovaline]$ echo *.txt
testi.txt tiedostot.txt

[opiskelija@halava tyovaline]$ ls *.???
index.html  testi.png  testi.txt  tiedostot.txt  tyylit.css
Jos osumia ei ole

Jos mikään tiedosto ei vastaa kuviota, bash jättää kuvion laajentamatta ja antaa sen ohjelmalle sellaisenaan. Siksi ls *.jpeg tyhjässä kansiossa valittaa cannot access '*.jpeg'. Kyse ei ole viasta vaan siitä, että osumia ei ollut.

25. Lainaaminen ja erikoismerkit

Lainausmerkkien tehtävä on estää se, että komentotulkki käsittelee erikoismerkin. Tämäon suoraa seurausta luvun 9 vaiheista.

Kolme lainaustapaa.
TapaVaikutusEsimerkki
'yksinkertaiset'Estää kaiken tulkinnan; teksti menee ohjelmalle sellaisenaanecho '$HOME on koti' tulostaa tekstin muuttumattomana
"kaksinkertaiset"Estää globbauksen ja sanoiksi jakamisen, mutta $MUUTTUJA laajenee yhäecho "Koti: $HOME" tulostaa polun
\ kenoviivaSuojaa yhden seuraavan merkinmv tämä\ nimi.png uusi.png

Erikoismerkkejä sisältävä tiedostonimi käsitellään siis näin:

[opiskelija@halava tyovaline]$ mv "tämä on hankala nimi.png" parempi_nimi.png
[opiskelija@halava tyovaline]$ mv tämä\ on\ hankala\ nimi.png parempi_nimi.png

Kuka tulkitsee tähden: shell vai ohjelma?

Joissakin komennoissa, esimerkiksi find-komennossa, korvausmerkki on tarkoitettu ohjelman tulkittavaksi eikä komentotulkin. Silloin merkki pitää suojata lainausmerkeillä tai kenoviivalla.

Oletetaan hakemisto, jonka sisältö on:

[opiskelija@halava vt]$ ls -1
index.html
vt1
vt2
vt3

Halutaan etsiä kaikista vt-alkuisista alikansioista kaikki html-tiedostot:

[opiskelija@halava vt]$ find vt* -name "*.html" -ls

Tässä on olennaista, että vt* on ilman lainausmerkkejä ja "*.html" lainausmerkeissä. Komentotulkki laajentaa ensimmäisen hakemistonimiksi, ja jälkimmäinen menee find-komennolle sellaisenaan. Todella suoritettava komento on:

find vt1 vt2 vt3 -name "*.html" -ls

Jos lainausmerkit unohtuvat, komentotulkki laajentaa myös jälkimmäisen kuvion nykyisen hakemiston tiedostonimiksi ja lopputulos on aivan toinen:

[opiskelija@halava vt]$ find vt* -name *.html -ls

on käytännössä

find vt1 vt2 vt3 -name index.html -ls

Eron näkee helpoimmin vertaamalla:

[opiskelija@halava vt]$ echo find vt* -name *.html -ls
[opiskelija@halava vt]$ echo find vt* -name "*.html" -ls
Globi ei ole säännöllinen lauseke

Tiedostonimien korvausmerkkejä kutsutaan usein virheellisesti säännöllisiksi lausekkeiksi (regexp). Kyseessä ovat eri järjestelmät, ja sama merkki tarkoittaa niissä eri asiaa. Sekaannus kostautuu heti, kun aloitat grep-komennon käytön.

MerkkiGlobi (tiedostonimet)Säännöllinen lauseke (grep, sed)
*Mikä tahansa merkkijonoEdellinen merkki 0 tai useampi kerta
?Yksi mikä tahansa merkkiEdellinen merkki 0 tai 1 kertaa (laajennetussa syntaksissa)
.Tavallinen pisteYksi mikä tahansa merkki
”mikä tahansa merkkijono”*.*

26. Tulostuksen edelleenohjaus

Komentorivikäytölle on tyypillistä työkaluajattelu, jossa monimutkaisemmat tehtävät suoritetaan yhdistelemällä yksinkertaisia työkaluja. Jokaisella ohjelmalla on kolme vakiovirtaa:

Oletuksena kaikki kolme on kytketty päätteeseen, minkä vuoksi tuloste ja virheilmoitukset näyttävät samalta. Ne ovat kuitenkin eri virtoja, ja ne voi ohjata eri paikkoihin.

Edelleenohjauksen merkinnät.
MerkintäToiminto
komento > tiedostoOhjaa vakiotulosteen tiedostoon. Korvaa vanhan sisällön
komento >> tiedostoLisää vakiotulosteen tiedoston perään
komento 2> virheet.txtOhjaa vain virhevirran tiedostoon
komento > ulos.txt 2>&1Ohjaa molemmat samaan tiedostoon
komento &> ulos.txtSama lyhyemmin (bash)
komento 2> /dev/nullHeittää virheilmoitukset pois
komento < syote.txtLukee vakiosyötteen tiedostosta
[opiskelija@halava demo3]$ ls -R > sisalto.txt
[opiskelija@halava demo3]$ cat sisalto.txt
.
dokkari.txt
sisalto.txt
virukset.txt

[opiskelija@halava demo3]$ find / -name "*.conf" 2> /dev/null | head -n 5

Jälkimmäisessä esimerkissä find törmää satoihin hakemistoihin, joihin sinulla ei ole lukuoikeutta. Ohjaamalla virhevirran roskiin näet vain varsinaiset osumat.

Kaksi klassista ansaa

27. Putkitus ja grep

Putkimerkki | kytkee edellisen komennon vakiotulosteen seuraavan komennon vakiosyötteeksi. Tämä on Unixin keskeisin idea: pienistä työkaluista rakennetaan uusia.

[opiskelija@halava ~]$ ls -l /etc | less
[opiskelija@halava ~]$ ls /etc | wc -l
232

grep

grep poimii rivit, joilla esiintyy haluttu merkkijono. Se on hyödyllisimpiä komentorivin työkaluja.

[opiskelija@halava ~]$ grep conf tiedostot.txt          # tiedostosta
[opiskelija@halava ~]$ ls /etc | grep conf              # putkesta
[opiskelija@halava ~]$ grep -i "TODO" muistiinpanot.txt # kirjainkoko ei väliä
[opiskelija@halava ~]$ grep -n "img" index.html         # näytä rivinumerot
[opiskelija@halava ~]$ grep -r "background" ~/html/         # koko puusta
[opiskelija@halava ~]$ grep -v "^#" asetukset.conf      # käänteinen: piilota kommentit
[opiskelija@halava ~]$ grep -c "error" loki.txt         # laske osumat
Grepin tärkeimmät vivut.
VipuToiminto
-iEi välitä kirjainkoosta
-nNäyttää rivinumerot
-rEtsii hakemistopuusta rekursiivisesti
-vNäyttää rivit, joilla kuviota ei ole
-cLaskee osumien määrän
-lNäyttää vain tiedostonimet, ei rivejä
-ELaajennettu säännöllisten lausekkeiden syntaksi

Hakukuvio on säännöllinen lauseke, ei globi. Perusmerkinnät:

Säännöllisten lausekkeiden alkeet.
MerkintäVastaa
^tekstiRivin alussa oleva teksti
teksti$Rivin lopussa oleva teksti
.Yksi mikä tahansa merkki
.*Mikä tahansa määrä mitä tahansa merkkejä
[0-9]Yksi numero
Lainaa haku aina

Kirjoita haku yksinkertaisiin lainausmerkkeihin: grep '^<h1' index.html. Muuten komentotulkki ehtii tulkita merkit *, $ ja < ennen greppiä.

Harjoitus 4

Selvitä yhdellä putkitetulla komennolla, montako .conf-päätteistä tiedostoa /etc-hakemistossa on. Vinkki: tarvitset komentoja ls, grep ja wc.

28. Komentojen ketjuttaminen ja paluuarvot

Jokainen ohjelma palauttaa lopettaessaan kokonaisluvun: 0 tarkoittaa onnistumista ja muut arvot virhettä. Arvon näkee muuttujasta $?.

[opiskelija@halava ~]$ ls olemassa.txt
olemassa.txt
[opiskelija@halava ~]$ echo $?
0
[opiskelija@halava ~]$ ls puuttuu.txt
ls: cannot access 'puuttuu.txt': No such file or directory
[opiskelija@halava ~]$ echo $?
2
Komentojen yhdistäminen samalle riville.
MerkintäToiminto
a ; bSuorita a, sitten b, riippumatta a:n onnistumisesta
a && bSuorita b vain jos a onnistui
a || bSuorita b vain jos a epäonnistui
a &Suorita a taustalla, palauta kehote heti
[opiskelija@halava ~]$ mkdir uusi && cd uusi
[opiskelija@halava uusi]$ cd ~/html && ls index.html || echo "Etusivu puuttuu!"

Merkintä && on erityisen hyödyllinen silloin, kun toinen komento olisi vaarallinen väärässä hakemistossa. Se estää tilanteen, jossa cd epäonnistuu mutta seuraava komento suoritetaan silti.

29. Tiedostojen oikeudet

Montaa käyttäjää tukevassa käyttöjärjestelmässä on olennaista ymmärtää tiedostojen oikeudet. Joitakin tiedostoja saa käyttää kuka tahansa, toisia vain omistaja ja toisia vain tietty ryhmä. Www-julkaisemisessa tämä on ratkaisevaa: palvelinohjelma lukee sivusi ”jonain muuna” kuin sinuna.

Oikeudet näkyvät komennolla ls -l:

[opiskelija@halava ~]$ ls -l
total 8
lrwxrwxrwx.  1 opiskelija students   36 Aug 26 12:43 html -> /wwwhome/home/opiskelija/public_html
-rw-r--r--.  1 opiskelija students  128 Aug 26 12:43 muistiinpanot.txt
-rwx------.  1 opiskelija students   64 Aug 26 12:44 varmuuskopio.sh

Ensimmäinen sarake on kymmenmerkkinen. Ensimmäinen merkki kertoo tyypin (- tavallinen tiedosto, d hakemisto, l symbolinen linkki). Yhdeksän seuraavaa jakautuvat kolmen ryhmiin:

Ensimmäisen rivin l tarkoittaa symbolista linkkiä: html ei ole tavallinen hakemisto vaan viittaus toisaalla olevaan hakemistoon.

Kussakin ryhmässä on kolme paikkaa: r (read), w (write) ja x (execute). Viiva - tarkoittaa, ettei kyseistä oikeutta ole.

Oikeudet tarkoittavat eri asiaa tiedostolle ja hakemistolle
OikeusTiedostollaHakemistolla
r Saa lukea sisällön Saa listata nimet, esimerkiksi ls
w Saa muuttaa sisältöä Saa luoda, poistaa ja nimetä uudelleen hakemiston sisällä olevia tiedostoja
x Saa suorittaa ohjelmana Saa kulkea hakemiston läpi: siirtyä siihen cd-komennolla ja käyttää sen sisällä olevia tiedostoja, jos niiden nimet ovat tiedossa

Huomaa erityisesti hakemiston x-oikeus: se ei ole listaamisoikeus vaan läpikulkuoikeus. Hakemisto, jolla on r muttei x, näyttää nimet mutta ei päästä tiedostoihin käsiksi. Hakemisto, jolla on x muttei r, päästää läpi mutta ei paljasta sisältöään. Www-palvelin tarvitsee x-oikeuden koko polkuun sivujesi juurelle asti.

Oikeuksien muuttaminen: chmod

chmod [vivut] [muutos] [tiedosto tai hakemisto]

Muutos annetaan joko symbolisesti tai oktaalilukuna. Vipu -R muuttaa oikeudet rekursiivisesti koko hakemistorakenteeseen.

Symbolinen muoto

Ensin kenelle, sitten miten, sitten mitä:

KenelleMitenMitä
u omistaja (user)+ lisäär luku
g ryhmä (group)- poistaw kirjoitus
o muut (other)= aseta täsmälleen, poistaa muutx suoritus tai läpikulku
a kaikki (all)
[opiskelija@halava ~]$ chmod a+x skripti.sh          # kaikille suoritusoikeus
[opiskelija@halava ~]$ chmod ug+w raportti.txt       # omistajalle ja ryhmälle kirjoitusoikeus
[opiskelija@halava ~]$ chmod -R go-rx yksityinen/    # ryhmältä ja muilta luku ja läpikulku pois
[opiskelija@halava ~]$ chmod u=rwx,go= salaisuudet/  # vain omistajalle kaikki oikeudet

Oktaalimuoto

Netin ohjeissa ja WinSCP:ssä oikeudet esitetään useimmiten kolminumeroisena lukuna. Kukin numero on yhden ryhmän oikeuksien summa: r = 4, w = 2, x = 1.

Tavallisimmat oktaaliset oikeudet.
LukuSymbolinenKäyttötarkoitus
644rw-r--r--Tavallinen www-tiedosto: omistaja muokkaa, muut lukevat
755rwxr-xr-xHakemisto tai ohjelma: omistaja kaikki, muut luku ja läpikulku
600rw-------Yksityinen tiedosto, esimerkiksi SSH-avain
700rwx------Yksityinen hakemisto
[opiskelija@halava ~]$ chmod 644 index.html
[opiskelija@halava ~]$ chmod 755 kuvat
Älä käytä 777:ää

chmod 777 antaa kaikille kirjoitusoikeuden. Se on netin ohjeissa yleinen ”korjaus”, joka poistaa oireen ja luo tietoturva-aukon: kuka tahansa palvelimen käyttäjä voi muuttaa tiedostojasi. Oikea ratkaisu on lähes aina 644 tiedostoille ja 755 hakemistoille.

Uusien tiedostojen oletusoikeudet: umask

Kun luot uuden tiedoston, sen oikeudet määräytyvät umask-arvon mukaan. Arvo kertoo, mitkä oikeudet poistetaan oletuksesta. Tyypillinen arvo 022 tuottaa tiedostoille oikeudet 644 ja hakemistoille 755.

[opiskelija@halava ~]$ umask
0022

Jos huomaat, että luomasi tiedostot eivät oletuksena näy www-palvelimelle, tarkista tämä arvo. Sen voi asettaa pysyvästi tiedostossa ~/.bash_profile.

Omistuksen muuttaminen: chown

chown [vivut] [omistaja:ryhmä] [tiedosto tai hakemisto]

chown muuttaa tiedoston omistajaa. Komento on tarkoitettu pääkäyttäjälle (root), eikä sitä tarvita tällä kurssilla. Tavallinen käyttäjä ei voi luovuttaa tiedostoaan toiselle, koska silloin hän menettäisi siihen oikeutensa. Ryhmän voi sen sijaan vaihtaa komennolla chgrp, jos kuuluu itse kohderyhmään.

30. Komentorivi web-julkaisemisessa

Tämä luku kokoaa yhteen ne komentorivin asiat, jotka aiheuttavat eniten ongelmia juuri www-sivujen julkaisemisessa.

30.1 Missä www-sivusi oikeasti ovat?

Jyväskylän yliopistossa kotihakemistosi (U:-asema) ja www-tilasi (W:-asema) ovat eri levyjärjestelmissä. Kotihakemistoon luotu tavallinen kansio ei siis näy verkossa. Www-tilaan päästään käsiksi kotihakemistoon tehdyn symbolisen linkin kautta, jonka nimi on tällä kurssilla html. Linkin tekee valmis komento:

[opiskelija@halava ~]$ /opiskelu/itkp1011/makewww

Tämän jälkeen html käyttäytyy kuin tavallinen kansio, vaikka tiedostot sijaitsevat toisaalla. Katso itse, minne linkki osoittaa:

[opiskelija@halava ~]$ ls -ld ~/html
lrwxrwxrwx. 1 opiskelija students 36 Sep  6 12:31 /nashome3/opiskelija/html -> /wwwhome/home/opiskelija/public_html
[opiskelija@halava ~]$ realpath ~/html
/wwwhome/home/opiskelija/public_html

Kaikki ~/html-hakemistoon tallennettu näkyy osoitteessa https://users.jyu.fi/~omatunnus/. Tiedosto ~/html/tyovaline/harkka/testi.txt löytyy siis osoitteesta https://users.jyu.fi/~omatunnus/tyovaline/harkka/testi.txt.

30.2 Sivut eivät näy: oikeuksien tarkistuslista

Selain näyttää virheen 403 Forbidden tai 404 Not Found. Palvelinohjelma lukee sivusi omana käyttäjänään, joten se on tiedostojesi näkökulmasta ”muut”. Käy läpi koko polku www-juuresta tiedostoon:

[opiskelija@halava ~]$ ls -ld ~/html/ ~/html/tyovaline/ ~/html/index.html
drwxr-xr-x. 4 opiskelija students 4096 Aug 26 12:41 /nashome3/opiskelija/html/
drwxr-xr-x. 3 opiskelija students 4096 Aug 26 12:42 /nashome3/opiskelija/html/tyovaline/
-rw-r--r--. 1 opiskelija students 1024 Aug 26 12:43 /nashome3/opiskelija/html/index.html

Vaadittava minimi:

Korjaus kerralla:

[opiskelija@halava ~]$ chmod -R a+rX ~/html/
Kaksi yksityiskohtaa tässä komennossa

Kauttaviiva lopussa. ~/html on symbolinen linkki. Päättämällä polun kauttaviivaan ~/html/ kerrot komennolle, että muutokset kohdistuvat linkin takana olevaan hakemistoon eivätkä linkkiin itseensä. Symbolisen linkin omia oikeuksia ei voi eikä tarvitse muuttaa.

Iso X. Vipu a+rX käyttää isoa X-kirjainta. Se lisää suoritusoikeuden vain hakemistoihin ja sellaisiin tiedostoihin, joilla se jo on. Pieni x tekisi jokaisesta HTML-tiedostosta suoritettavan ohjelman, mikä on tarpeetonta ja epäsiistiä.

Kotihakemiston oikeudet ovat eri asia

Netin ohjeissa neuvotaan usein antamaan kotihakemistolle suoritusoikeus (chmod o+x ~), koska monissa järjestelmissä public_html on kotihakemiston sisällä ja palvelimen on päästävä kulkemaan sen läpi. Halavassa ja jalavassa tämä ei auta, koska www-tila on eri levyllä. Älä siis avaa kotihakemistoasi muille turhaan: se paljastaisi tiedostojesi nimet muille koneen käyttäjille.

30.3 Isot ja pienet kirjaimet

Windows kohtelee nimiä Kuva.JPG ja kuva.jpg samana tiedostona; Linux-palvelin ei. Tästä syystä sivu, joka toimii omalla koneellasi, näyttää palvelimella rikkinäisen kuvan kuvakkeen. Sama koskee hakemistonimiä ja tiedostopäätteitä: .HTML ei ole .html.

[opiskelija@halava html]$ grep -o 'src="[^"]*"' index.html
src="kuvat/Logo.PNG"
[opiskelija@halava html]$ ls kuvat/
logo.png

Ratkaisu: nimeä kaikki tiedostot pienillä kirjaimilla ja viittaa niihin täsmälleen samoin.

[opiselija@halava kuvat]$ mv Logo.PNG logo.png

30.4 Ääkköset ja välilyönnit osoitteissa

Tiedostonimi päätyy osoiteriville. Välilyönti muuttuu merkinnäksi %20 ja ääkköset kahdeksi tai useammaksi prosenttimerkiksi. Osoitteet muuttuvat lukukelvottomiksi ja linkittäminen hankaloituu. Käytä nimissä vain merkkejä a–z, 0–9, väliviivaa ja alaviivaa.

30.5 Rivinvaihdot: Windowsista siirretty tiedosto

Windows päättää tekstirivin kahdella merkillä (CR LF), Unix yhdellä (LF). Useimmiten tällä ei ole väliä, mutta se rikkoo skriptit ja joskus palvelinasetustiedostot. Tunnistat ongelman file-komennolla tai siitä, että virheilmoituksen lopussa on merkintä \r.

[opiskelija@halava ~]$ file julkaise.sh
julkaise.sh: Bourne-Again shell script, ASCII text executable, with CRLF line terminators
[opiskelija@halava ~]$ dos2unix julkaise.sh
[opiskelija@halava ~]$ file julkaise.sh
julkaise.sh: Bourne-Again shell script, ASCII text executable

Jos dos2unix-ohjelmaa ei ole asennettuna, saman voi tehdä komennolla sed -i 's/\r$//' julkaise.sh.

30.6 Merkistö

Käytä kaikissa tiedostoissa UTF-8-koodausta ja ilmoita se HTML-dokumentissa. Tarkista epäselvä tiedosto:

[opiskelija@halava html]$ file -i index.html
index.html: text/html; charset=utf-8
[opiskelija@halava html]$ grep -i charset index.html
    <meta charset="utf-8" />

Jos ääkköset näkyvät selaimessa kysymysmerkkeinä tai merkkinä ä, tiedosto on todennäköisesti tallennettu Latin-1-muodossa. Muunnos onnistuu näin:

[opiskelija@halava html]$ iconv -f ISO-8859-1 -t UTF-8 vanha.html > uusi.html

30.7 Sivujen julkaisu ja tarkistus

Kopioi sivut omalta koneelta palvelimelle:
$ rsync -avz --delete sivusto/ omatunnus@halava.cc.jyu.fi:html/

Tarkista palvelimen vastaus ilman selainta:
$ curl -I https://users.jyu.fi/~omatunnus/

Lataa sivu ja katso, mitä palvelin todella lähetti:
$ curl -s https://users.jyu.fi/~omatunnus/ | head -n 20

curl -I pyytää vain HTTP-otsakkeet. Statuskoodi kertoo suoraan, mistä on kyse: 200 OK onnistui, 403 Forbidden on oikeusongelma ja 404 Not Found tarkoittaa väärää tiedostonimeä tai polkua.

Harjoitus 5

Aseta ~/html-hakemistossa olevan index.html-tiedoston oikeudeksi 600 ja lataa sivu selaimessa. Mikä virhekoodi tulee? Palauta sitten oikeudeksi 644 ja tarkista tulos komennolla curl -I.

31. Ympäristömuuttujat ja PATH

Käyttöjärjestelmässä on joukko asetuksia, joiden on tarkoitus olla yhteisiä kaikille ohjelmille. Ne välitetään ympäristömuuttujina. Kaikki muuttujat näkee komennolla env, yhden muuttujan arvon echo-komennolla.

[opiskelija@halava ~]$ echo $HOME
/nashome3/opiskelija
[opiskelija@halava ~]$ echo $USER
opiskelija
[opiskelija@halava ~]$ env | sort | head -n 10
Tavallisimmat ympäristömuuttujat.
MuuttujaSisältö
HOMEKotihakemiston polku; sama minkä ~ tuottaa
USERKäyttäjätunnus
PATHKansiot, joista ohjelmia etsitään
SHELLKäytössä oleva komentotulkki
EDITOROletuseditori, jonka muut ohjelmat käynnistävät
LANGKieli- ja merkistöasetus, esimerkiksi fi_FI.UTF-8
TMPDIRVäliaikaistiedostojen kansio

PATH

PATH luettelee kaksoispistein eroteltuna ne kansiot, joista ohjelmia etsitään, kun kirjoitat komennon nimen.

[opiskelija@halava ~]$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/nashome3/opiskelija/bin
[opiskelija@halava ~]$ which ls
/usr/bin/ls
[opiskelija@halava ~]$ type cd
cd is a shell builtin

Jos ohjelmasi ei ole missään PATH-kansiossa, sinun on viitattava siihen polulla:

[opiskelija@halava ~]$ ~/bin/omaohjelma
[opiskelija@halava bin]$ ./omaohjelma

Merkintä ./ tarkoittaa oletushakemistoa. Sitä tarvitaan, koska turvallisuussyistä oletushakemisto ei ole PATHissa: muuten hakemistoon ujutettu ls-niminen tiedosto suoritettaisiin oikean ls-komennon sijaan.

PATHiin lisätään kansioita säilyttäen vanha arvo:

[opiskelija@halava ~]$ export PATH="$PATH:$HOME/bin"

Muutos katoaa istunnon päättyessä. Pysyvän siitä saa lisäämällä rivin tiedostoon ~/.bash_profile. Windowsissa vastaava tehdään komennolla setx tai järjestelmäasetuksista.

Säilytä vanha arvo

Jos kirjoitat export PATH=$HOME/bin ilman $PATH:-osaa, pyyhit kaikki järjestelmän kansiot pois etsintäpolusta ja lähes jokainen komento lakkaa toimimasta. Tilanteesta selviää avaamalla uuden pääteyhteyden.

32. Prosessien hallinta

Jokainen käynnissä oleva ohjelma on prosessi, jolla on numero (PID). Joskus ohjelma jumittuu ja se pitää pysäyttää, joskus pitkä ajo halutaan taustalle.

[opiskelija@halava ~]$ ps              # omat prosessit tässä päätteessä
    PID TTY          TIME CMD
  12043 pts/0    00:00:00 bash
  12587 pts/0    00:00:03 python3
  12601 pts/0    00:00:00 ps
[opiskelija@halava ~]$ ps -u $USER     # kaikki omat prosessit
[opiskelija@halava ~]$ top             # jatkuvasti päivittyvä näkymä, poistu q:lla
[opiskelija@halava ~]$ jobs            # tämän päätteen pysäytetyt ja taustatyöt

Prosessin lopettaminen

kill lähettää prosessille signaalin. Se ei siis välttämättä tapa mitään, vaan pyytää prosessia reagoimaan.

Tärkeimmät signaalit lievimmästä järeimpään.
KomentoSignaaliVaikutus
kill 12587SIGTERM (15)Oletus. Pyytää ohjelmaa lopettamaan siististi. Ohjelma ehtii tallentaa työnsä
kill -1 12587SIGHUP (1)”Yhteys katkesi.” Monet palvelinohjelmat lukevat tästä asetuksensa uudelleen sen sijaan että lopettaisivat
kill -9 12587SIGKILL (9)Viimeinen keino. Ydin lopettaa prosessin välittömästi; se ei voi estää tätä eikä ehdi tallentaa mitään
Oikea järjestys

Kokeile ensin Ctrl+C, sitten kill PID, ja vasta jos kumpikaan ei auta, kill -9 PID. Merkintä kill -1 ei ole järeämpi vaan lievempi kuin oletus, joten se ei ole ratkaisu jumittuneeseen ohjelmaan.

Hätäjarru

kill -9 -1 lopettaa kaikki prosessisi, myös pääteyhteytesi ja mahdolliset tallentamattomat editorit. Käytä vain, kun mikään muu ei auta.

Etuala ja tausta

[opiskelija@halava ~]$ python3 pitka_ajo.py
^Z
[1]+  Stopped                 python3 pitka_ajo.py
[opiskelija@halava ~]$ bg
[1]+ python3 pitka_ajo.py &
[opiskelija@halava ~]$ jobs
[1]+  Running                 python3 pitka_ajo.py &
[opiskelija@halava ~]$ fg
python3 pitka_ajo.py

Ohjelmat, jotka jatkavat uloskirjautumisen jälkeen

Normaalisti prosessisi lopetetaan, kun kirjaudut ulos. Jos pitkän ajon pitää jatkua, käytä tmux- tai screen-ohjelmaa. Ne pitävät istunnon pystyssä, ja siihen voi palata myöhemmin toiselta koneelta.

[opiskelija@halava ~]$ tmux new -s tyo       # luo istunnon nimeltä "tyo"
... aja ohjelmia, irtaudu näppäilemällä Ctrl+B ja sitten d ...
[opiskelija@halava ~]$ tmux ls               # listaa istunnot
[opiskelija@halava ~]$ tmux attach -t tyo    # palaa istuntoon

Yksittäisen komennon voi myös irrottaa päätteestä komennolla nohup:

[opiskelija@halava ~]$ nohup ./pitka_ajo.sh > ajo.log 2>&1 &

33. Komentotulkit ja PowerShell

Komentorivin käyttäminen riippuu käytetystä komentotulkista. Unix-ympäristöissä yleisin on bash; muita ovat zsh (macOS:n oletus), csh, fish ja dash. Perusasiat toimivat kaikissa samalla tavalla.

Windowsissa on kaksi vaihtoehtoa: vanha cmd.exe ja moderni PowerShell. Molemmat käynnistyvät näppäinyhdistelmällä Win+R kirjoittamalla cmd tai powershell. Suositeltavin on kuitenkin Windows Terminal, joka on välilehdellinen pääteohjelma ja osaa ajaa kaikkia näitä.

PowerShell ei ole bash

PowerShellissä on aliakset kuten ls ja cp, minkä vuoksi yksinkertaiset komennot näyttävät toimivan samoin. Aliakset kattavat kuitenkin vain komennon nimen, eivät vipuja: ls -al antaa PowerShellissä virheen, koska -al ei ole Get-ChildItem-käskyn parametri. Lisäksi PowerShell 7:n Linux- ja macOS-versioista ls- ja cp-aliakset on poistettu, jotta ne eivät peittäisi oikeita komentoja.

Jos haluat aidon Unix-ympäristön Windowsiin (suositus), käytä WSL:ää (Windows Subsystem for Linux). Se asentuu komennolla wsl --install ja antaa käyttöösi oikean Linux-jakelun. Kevyempi vaihtoehto pelkkiä perustyökaluja varten on Git for Windows -paketin mukana tuleva Git Bash.

Komentojen vastaavuudet

Windowsin cmd.exe ja Unix. Huomaa, että Unixissa isoilla ja pienillä kirjaimilla on merkitystä, cmd.exessä ei.
cmd.exeUnixEsimerkkiToiminta
\/Hakemistoerotin
/-ls -alVipujen etumerkki
..cp ../index.html .Oletushakemisto
....cd ..Isähakemisto
D:Levyaseman vaihto; Unixissa kaikki on yhdessä puussa
dirls -lals -la tyovalineHakemistolistaus
cdcdcd tyovaline/luennotVaihtaa oletushakemiston
md, mkdirmkdirmkdir -p a/b/cLuo hakemiston
rd, rmdirrmdirrmdir luento1Poistaa tyhjän hakemiston
copycpcp demo1.txt luennot/Kopioi tiedostoja
typecatcat luento1.txtTulostaa sisällön
renmvmv demot demojaNimeää uudelleen
movemvmv luento1.txt ../demot/Siirtää tiedoston
delrmrm luento1.txtPoistaa tiedoston
find, findstrgrepgrep foo bar.txtEtsii rivejä
clsclearclearTyhjentää näytön
chmodchmod 644 index.htmlMuuttaa oikeuksia
edit, notepadnanonano luento1.txtTekstieditori
ohjelma /?man ohjelmaman lsKäyttöohje; useimmissa myös ohjelma --help

Windowsissa hyödyllisiä verkkotyökaluja ovat ping, tracert (Unixissa traceroute), ipconfig (Unixissa ip addr) ja netstat (Unixissa ss).

34. Tiedostojen siirto ja paketointi

scp

scp on komentoriviltä toimiva WinSCP:tä ja FileZillaa vastaava ohjelma tiedostojen turvalliseen kopiointiin koneiden välillä. Se on nykyään mukana myös Windowsissa ja macOS:ssä. Kaksoispiste erottaa konenimen ja polun.

Omalta koneelta palvelimelle:
$ scp index.html omatunnus@halava.cc.jyu.fi:html/

Palvelimelta omalle koneelle nykyiseen hakemistoon:
$ scp omatunnus@halava.cc.jyu.fi:html/index.html .

Kokonainen hakemisto:
$ scp -r sivusto omatunnus@halava.cc.jyu.fi:html/

Uudella nimellä:
$ scp omatunnus@halava.cc.jyu.fi:temp/tiedosto.txt teksti.txt

rsync

rsync synkronoi hakemistoja ja siirtää vain muuttuneet tiedostot. Isolla sivustolla ero scp-komentoon on valtava.

$ rsync -avz sivusto/ omatunnus@halava.cc.jyu.fi:html/
$ rsync -avzn --delete sivusto/ omatunnus@halava.cc.jyu.fi:html/
rsyncin tärkeimmät vivut.
VipuMerkitys
-aArkistotila: rekursiivinen, säilyttää oikeudet ja aikaleimat
-vKertoo, mitä tekee
-zPakkaa siirron ajaksi
-nKuivaharjoitus: näyttää mitä tapahtuisi, muttei tee mitään
--deletePoistaa kohteesta tiedostot, joita lähteessä ei ole
Kaksi rsyncin sudenkuoppaa

Paketointi

$ tar -czf sivusto.tar.gz sivusto/     # pakkaa hakemiston
$ tar -tzf sivusto.tar.gz              # listaa sisällön purkamatta
$ tar -xzf sivusto.tar.gz              # purkaa
$ zip -r sivusto.zip sivusto/          # zip, jos vastaanottaja käyttää Windowsia
$ unzip sivusto.zip

Vivut tarkoittavat: c create, x extract, t list, z gzip-pakkaus, f tiedostonimi seuraa. Listaa sisältö aina ennen purkamista, jottei paketti räjähdä kymmeneksi tiedostoksi nykyiseen hakemistoon.

35. Tarkistuslista ja itsearviointi

Käy lista läpi ennen demoja. Jos johonkin kohtaan ei löydy vastausta, palaa linkitettyyn lukuun.

  1. Miten selvität, missä hakemistossa olet ja mitä siellä on? (luku 10)
  2. Mitä eroa on viittauksilla luennot/luento1 ja ~/tyovaline/luennot/luento1? (luvut 18–19)
  3. Miksi cd ../luennot toimii toisesta hakemistosta muttei toisesta? (luku 18)
  4. Mitä komentotulkki tekee riville rm *.txt ennen kuin rm käynnistyy? Miten voit tarkistaa tuloksen etukäteen? (luvut 9 ja 24)
  5. Mitä tapahtuu, jos ajat rm * .txt? (luku 20)
  6. Mitä eroa on merkinnöillä > ja >>? (luku 26)
  7. Miksi virheilmoitus näkyy ruudulla, vaikka ohjasit tulosteen tiedostoon? (luku 26)
  8. Mitä oikeudet drwxr-xr-x tarkoittavat hakemistolle? (luku 29)
  9. Sivusi antaa selaimessa virheen 403. Mitkä kolme asiaa tarkistat? (luku 30)
  10. Kuvasi ei näy palvelimella, vaikka se näkyi omalla koneellasi. Mikä on todennäköisin syy? (luku 30)
  11. Ohjelma ei reagoi Ctrl+C:hen. Missä järjestyksessä etenet? (luku 32)
  12. Miten teet komennosta toistettavan niin, ettei sitä tarvitse kirjoittaa ensi viikolla uudelleen? (Komentojonot eli skriptit)

36. Sanasto

Komentotulkki, shell
Ohjelma, joka lukee komentorivin, laajentaa sen ja käynnistää ohjelmat. Esimerkiksi bash.
Pääte, terminaali, konsoli
Ikkuna, jossa komentotulkkia käytetään. Nykyiset ohjelmat ovat pääte-emulaattoreita, jotka matkivat 1970-luvun päätelaitteita.
Kehote, prompt
Merkkijono, jolla shell ilmoittaa odottavansa komentoa. Päättyy yleensä merkkiin $.
Vipu, valitsin, flag, option
Komennon toimintaa muuttava parametri, esimerkiksi -l tai --all.
Parametri, argumentti
Komennolle annettu kohde, esimerkiksi tiedostonimi.
Oletushakemisto, työhakemisto, working directory
Hakemisto, jossa parhaillaan toimit. Merkitään pisteellä ..
Kotihakemisto, home directory
Oma hakemistosi, johon kirjaudut. Merkitään tildellä ~.
Polku, path
Tiedoston tai hakemiston sijainti. Suhteellinen polku luetaan oletushakemistosta, absoluuttinen juuresta / tai kotihakemistosta.
Globbaus, wildcards
Tiedostonimien korvausmerkit * ja ?, jotka komentotulkki laajentaa nimiksi ennen komennon suorittamista.
Säännöllinen lauseke, regexp
Erillinen kuviokieli tekstin hakemiseen. Käytetään esimerkiksi grep-komennossa. Ei sama asia kuin globbaus.
Vakiotuloste ja virhevirta, stdout ja stderr
Kaksi erillistä tulostusvirtaa. Molemmat näkyvät oletuksena päätteessä, mutta ne voi ohjata erikseen.
Putki, pipe
Merkintä |, joka kytkee ohjelman tulosteen seuraavan ohjelman syötteeksi.
Prosessi ja PID
Käynnissä oleva ohjelma ja sen tunnistenumero.
Signaali
Viesti prosessille, esimerkiksi SIGINT (Ctrl+C), SIGTERM (kill) tai SIGKILL (kill -9).
Komentojono, skripti
Tekstitiedosto, joka sisältää komentoja ja jonka voi suorittaa ohjelmana.
Shebang
Skriptin ensimmäinen rivi #!/bin/bash, joka kertoo tulkkiohjelman.

37. Lisätietoa ja syventävät aiheet

Seuraavat kaksi kokonaisuutta eivät kuulu kurssin ydinsisältöön, mutta ne säästävät työtä heti kun komentorivi alkaa tuntua tutulta. Avaa lohko napsauttamalla otsikkoa.

SSH-avaimet: salasanan kirjoittaminen pois käytöstä

Salasanan naputtelu joka kerta käy nopeasti raskaaksi. SSH-avainpari korvaa sen: julkinen avain kopioidaan palvelimelle, salainen avain jää omalle koneellesi. Tee tämä omalla koneellasi, ei halavassa:

ssh-keygen -t ed25519 -C "oma.nimi@student.jyu.fi"
ssh-copy-id omatunnus@halava.cc.jyu.fi

Ensimmäinen komento kysyy avaimen tallennuspaikan (paina vain Enter ja salalauseen. Anna salalause; se suojaa salaisen avaimen, jos koneesi varastetaan.

Älä koskaan jaa salaista avainta

Tiedosto id_ed25519 (ilman .pub-päätettä) on salainen avaimesi. Sitä ei kopioida palvelimelle, liitetä sähköpostiin eikä lisätä versionhallintaan. Vain .pub-tiedosto on tarkoitettu jaettavaksi.

Symboliset linkit

Symbolinen linkki (symbolic link, symlink, pehmeä linkki) on tiedosto, jonka koko sisältö on polku johonkin toiseen tiedostoon tai hakemistoon. Kun avaat linkin, käyttöjärjestelmä ohjaa sinut automaattisesti sen osoittamaan kohteeseen. Linkki käyttäytyy siis kuin oikotie: sen kautta samaan hakemistoon voi viitata usealla nimellä ja monesta paikasta.

Linkki luodaan ln-komennolla. Vipu -s tekee siitä symbolisen. Parametrit ovat samassa järjestyksessä kuin cp-komennossa: ensin kohde, sitten luotava nimi.

ln -s [mihin linkki osoittaa] [luotavan linkin nimi]

Tällä kurssilla tarvittava linkki www-tilaan luodaan valmiilla komennolla /opiskelu/itkp1011/makewww, joka tekee käytännössä saman kuin:

[opiskelija@halava ~]$ ln -s /wwwhome/home/$USER/public_html ~/html

Komennossa $USER on ympäristömuuttuja, jonka tilalle komentotulkki sijoittaa käyttäjätunnuksesi. Sama komento toimii siis kaikille. Merkintä ~ tarkoittaa kotihakemistoa, joten linkki syntyy kotihakemistoon riippumatta siitä, missä olit komentoa antaessasi.

Linkin tunnistaminen ja tutkiminen

Listauksessa symbolisen linkin tunnistaa rivin ensimmäisestä kirjaimesta l ja nuolesta, joka kertoo kohteen:

[opiskelija@halava ~]$ ls -ld ~/html
lrwxrwxrwx. 1 opiskelija students 36 Sep  6 12:31 /nashome3/opiskelija/html -> /wwwhome/home/opiskelija/public_html
[opiskelija@halava ~]$ realpath ~/html
/wwwhome/home/opiskelija/public_html
[opiskelija@halava ~]$ file ~/html
/nashome3/opiskelija/html: symbolic link to /wwwhome/home/opiskelija/public_html

Linkin omat oikeudet (lrwxrwxrwx) ovat merkityksettömiä. Ratkaisevia ovat aina kohteen oikeudet, ja chmod muuttaakin oletuksena kohteen eikä linkin oikeuksia.

Miksi linkkejä kannattaa käyttää

  • Pitkä polku lyhenee muistettavaan muotoon. cd ~/html on paljon helpompi kuin koko /wwwhome-polku.
  • Sama tiedosto voi näkyä monessa paikassa ilman, että sitä kopioidaan. Kopiot ehtivät erkaantua toisistaan; linkki ei voi.
  • Ohjelmaversion voi vaihtaa siirtämällä linkkiä. Esimerkiksi ohjelma -> ohjelma-2.4 voidaan vaihtaa osoittamaan uuteen versioon koskematta mihinkään muuhun.

Kova linkki

Toinen linkkityyppi on kova linkki (hard link), joka syntyy ln-komennolla ilman -s-vipua. Kova linkki ei ole viittaus polkuun vaan toinen nimi täsmälleen samalle tiedostolle. Se toimii vain saman levyosion sisällä eikä hakemistoille lainkaan. Koska emme tiedä palvelimen levyjärjestelyistä mitään, käytännössä käytetään aina symbolista linkkiä.

Kolme yleistä sudenkuoppaa
  • Rikkinäinen linkki. Jos kohde poistetaan tai siirretään, linkki jää osoittamaan tyhjään ja cd antaa virheen No such file or directory, vaikka linkki näkyy listauksessa. Tarkista ls -l- tai realpath-komennolla.
  • Suhteellinen kohde. Jos annat kohteen suhteellisena polkuna, se tulkitaan linkin sijainnista käsin, ei siitä hakemistosta, jossa olit komentoa kirjoittaessasi. Anna kohde varmuuden vuoksi absoluuttisena.
  • Kauttaviiva lopussa. rm ~/html poistaa pelkän linkin, mikä on turvallista. rm -r ~/html/ menee linkin läpi ja poistaa kohdehakemiston sisällön eli koko www-sivustosi. Ero on yksi merkki.
Komentojonot eli skriptit

Komentojono on tekstitiedosto, joka sisältää komentoja. Se on koko komentorivin suurin hyöty: kerran ratkaistun ongelman voi tallentaa ja toistaa.

Ensimmäinen skripti

Luo tiedosto julkaise.sh nanolla:

#!/bin/bash
# Kopioi sivut palvelimen www-hakemistoon ja korjaa oikeudet.

cp -r ~/sivusto/* ~/html/
chmod -R a+rX ~/html/
echo "Julkaistu $(date)."

Anna tiedostolle suoritusoikeus ja aja se:

[opiskelija@halava ~]$ chmod u+x julkaise.sh
[opiskelija@halava ~]$ ./julkaise.sh
Julkaistu to 27.8.2026 09.31.15 +0300.

Rivi #!/bin/bash on nimeltään shebang. Se kertoo käyttöjärjestelmälle, millä ohjelmalla tiedosto suoritetaan, ja sen on oltava tiedoston ensimmäinen rivi. Risuaidalla # alkavat rivit ovat kommentteja. Merkintä $(komento) korvautuu komennon tulosteella.

Parametrit

Skriptille annetut parametrit näkyvät muuttujina $1, $2 ja niin edelleen. $0 on skriptin oma nimi ja $@ kaikki parametrit.

#!/bin/bash
# varmuuskopio.sh HAKEMISTO

if [ -z "$1" ]; then
    echo "Käyttö: $0 HAKEMISTO"
    exit 1
fi

tar -czf "varmuuskopio-$(date +%Y%m%d).tar.gz" "$1"
echo "Kopioitu hakemisto $1."
[opiskelija@halava ~]$ ./varmuuskopio.sh html/
Kopioitu hakemisto html/.
Lainaa muuttujat

Kirjoita muuttujaviittaukset aina lainausmerkeissä: "$1" eikä $1. Muuten välilyöntejä sisältävä tiedostonimi hajoaa useaksi parametriksi – sama sanoiksi jakamisen ilmiö kuin komentorivillä.

Silmukka

Tämä on se työkalu, joka muuttaa sadan valokuvan käsittelyn minuutin työksi:

#!/bin/bash
# Muunna kaikki png-kuvat jpeg-muotoon ja pienennä ne.

for kuva in *.png; do
    echo "Käsitellään $kuva..."
    convert "$kuva" -resize 800x600 "${kuva%.png}.jpg"
done

Merkintä ${kuva%.png} poistaa nimen lopusta päätteen .png, jolloin tilalle voi liittää uuden.

Harjoitus 6

Kirjoita skripti tarkista.sh, joka tulostaa ~/html-hakemistosi jokaisen html-tiedoston nimen ja rivimäärän. Vinkki: for, wc -l.

Aliakset

Alias on lyhenne komennolle. Aliakset kannattaa tallentaa tiedostoon ~/.bashrc, jolloin ne ovat käytössä joka istunnossa.

alias ll='ls -alF'
alias rm='rm -i'
alias julkaise='rsync -avz ~/sivusto/ halava:html/'

Muutokset tulevat voimaan seuraavassa istunnossa tai komennolla source ~/.bashrc.

Linkkejä

Käyttäjien kommentit

Kommentoi Lisää kommentti