.. raw:: latex

  %make block paragraphs:
  \parindent0pt  \parskip10pt

.. TODO: Ruudunlukijan käyttöön opastus screenin kanssa. Varmaan tarpeen
   erillinen ohje.

   Esim. "nvda screen reader" (kaupallinen vaihtoehto Jaws)
   Macille on VoiceOver. Linuxille ainakin ORCA.

   PDF-lukuohjelma Adobe Digital Editions..

   TODO: echo -> printf kaikissa paitsi ekan demon ekassa kohdassa?
   ...Koska echo on POSIXissa "deprecated"-tilassa.
   Vai sittenkin... demon 2 alussa, ja erillinen aihepiirivideo tästä
   printf:n käytöstä. Joo.. ilman muuta niin.
   ... Koska printf ei oo ihan hetsimppeli vehe..
   echo helpompi ymmärtää aluksi, ja se nyt varmaan deprekoitunakin elää
   pari vuosikymmentä vielä..

##############
Sormet unixiin
##############

ITKA203 Käyttöjärjestelmät -kurssin Demo 1 keväällä 2015 ja 2016 ja
2017 ja 2018 ja 2019 ja 2020 ja 2021 ja 2022 ja 2023 ja 2024:
"Superpikaintro interaktiivisen Unix-shellin käyttöön"

Paavo Nieminen, ``paavo.j.nieminen@jyu.fi``

Jyväskylän yliopiston Informaatioteknologian tiedekunta.

.. TODO: Pikkasen paha tämä: Täällä puhutaan "skriptistä" vaikkei ole
   vielä kovinkaan paljon esitelty konseptia.. Pittäis varmaan
   kuitenkin mennä asia kerrallaan!!! Mietintämyssyyn,
   mietintämyssyyn..  No mutta joo.. toisaalta näissä ohjeissa myös
   kerrotaan, mikä se skripti on.

.. contents::

Mistä tässä harjoitteessa on kyse
=================================

Tämä demo syntyi alunperin Käyttöjärjestelmät
-kesäkurssilla 2007. Kiitän silloisia kurssilaisia hyödyllisestä
ensipalautteesta. Sisältö on kestävää 1970-luvulta näköpiirissä
olevaan tulevaisuuteen.

Tämän pitäisi olla Superpikaintro, joten tätä voi mennä aika
nopeastikin läpi. Mutta älä kiiruhda! Kaikki asiat ovat tärkeitä ja ne
oletetaan tunnetuiksi jatkossa. Näitä perusasioita on **syytä
kertailla tulevaisuudessa tällä kurssilla ja myöhemminkin!**

**Kannattaa tehdä omia muistiinpanoja** aina, kun opiskelet
uutta. Silloin voit palata myöhemmin itsellesi avoimeksi jääneisiin
kysymyksiin ja merkityksellisimpiin opittuihin asioihin. Tämä pätee
demoihin, luentomonisteeseen, esimerkkikoodeihin ja myös
live-luentoihin ja ryhmäkeskusteluihin.

Terminologia ja teoria alta pois: *Shell* on englantia ja tarkoittaa
suomeksi kuorta. Tässä demossa käytetään nimenomaan käyttöjärjestelmän
päälle tehtyä kuorta eli apuohjelmaa, jolla käyttöjärjestelmän
tarjoamia palveluita päästään käyttämään. Kuori voi olla graafinen,
klikkailtava kuori, tai tekstimuotoinen.

Tekstimuotoisesta kuoresta meille on käyttöjärjestelmien
peruskurssilla hyötyä ainakin neljästä syystä:

1. Tyypillisiä käyttöjärjestelmän ja laitteiston toimintoja on
   täsmällistä ja selkeää havainnollistaa tekstimuotoisilla
   komennoilla.

2. Tekstimuotoisen kuoren komentoja päästään myöhemmin suoraan
   kirjoittamaan komentoriviohjelmiksi eli **skripteiksi**.

3. Tekstikuorten käyttö on nykyisin harvinaisempaa
   tietokoneharrastelijoiden ja peruskäyttäjien keskuudessa, joten
   sitä on jopa aiemaa tarpeellisempaa opetella erikseen tällaisella
   tulevien ammattilaisten ja tehokäyttäjien kurssilla.

4. Standardoitujen tai vakiintuneiden menettelyjen oppimisesta on
   kestävää hyötyä pitkälle näköpiirissä olevaan
   työelämätulevaisuuteen.

Yleisesti ottaen kuorityyppinen komenteluohjelmisto voidaan ajatella
minkä tahansa kommenneltavan järjestelmän ympärille. Tässä tapauksessa
kyseessä on käyttöjärjestelmäohjelmiston kuori.

Suora lainasana "shell" on kansainvälisesti tunnettu ja suomen
kieleenkin vakiintunut. Oma kielikorvani kuitenkin muuttui 2010-luvun
mittaan sellaiseksi, että suomeksi puhun mieluummin kuoresta. Joskus
vielä lipsahtaa sekä suuhun että tekstiin kuitenkin "shell".

*Shell* tai *kuori* - molemmat on syytä joka tapauksessa tietää ja
ymmärtää samaksi asiaksi.

Harjoituksen tavoitteet:

- Tekstimuotoisen kuoren perusidea tulee sinulle tutuksi ja
  kuorikomentojen kirjoittaminen alkaa mennä selkärankaan käytännön
  tekemisen kautta.

- Saat hieman ohjattua käytännön kokemusta tekstikuoren käytöstä;
  vinkit ovat tärkeitä, etenkin jos tämä on ensimmäinen kerta ikinä.

- Näet ainakin nimeltä ja päällisin puolin kertaalleen joitain
  perusohjelmia, joita Unix/Linux -järjestelmiin on useimmiten
  asennettu; näet myös joitakin "unixmaisia"
  käytäntöjä esimerkiksi käyttäjän näkökulmasta tiedostojärjestelmään.

- Opit, miten aihetta voi itsenäisesti oppia lisää myöhemmin sitten,
  kun on tarpeen jossakin työ-, harrastus- tai opiskelutehtävissä.

- Käyttöjärjestelmäkurssin myöhemmät demot olettavat, että tämän demon
  pohjataidot jo osataan.


Keväällä 2015 määriteltyjen osaamistavoitteiden osalta demon tehtyään
opiskelija:

- uskaltaa ja osaa käyttää "unix-tyyppistä" käyttöjärjestelmää,
  esim. Linuxia, komentorivikuoren avulla sekä pääteyhteyden yli,
  aiheuttamatta vaaraa omille tiedoille tai häiriötä muille
  käyttäjille tai järjestelmälle [ydin/arvos1]

- osaa rakentaa yksittäisiä bash-komentorivejä, hyödyntäen putkitusta
  ja tiedostoonohjausta [ydin/arvos1]

Lisäksi *aloitetaan* tähtääminen myöhemmässä vaiheessa kurssin aikana
saavutettavaksi tarkoitettuihin osaamistavoitteisiin. Erityisesti
niihin, joissa opiskelija:

- tuntee Bourne Again Shell -kuoren (bash) tärkeimmät (erityisesti
  POSIX-yhteensopivat) sisäänrakennetut komennot sekä yleisimmät
  unix-tyyppisiin (etenkin POSIX-yhteensopiviin) järjestelmiin
  asennetut apuohjelmat (grep, find, ...); osaa käyttää näitä
  manuaalisivujen perusteella sekä arvioida kriittisesti
  nettifoorumeilta löytyvien ohjeiden laatua [ydin/arvos1]

- osaa luetella käyttötarkoituksia, joihin yleisesti käytetään
  kuorikomentojonoja (shell script, "skripti") [ydin/arvos1]

- ymmärtää komentoriviargumenttien ja ympäristömuuttujien roolin
  sovellusohjelman toimintaympäristön osana; osaa antaa käyttöohjeiden
  mukaisia argumentteja komentoriviohjelmille sekä julkaista
  ympäristömuuttujia bash-kuoressa [ydin/arvos2]

- pystyy lukemaan ja ymmärtämään yksinkertaisia bash -skriptejä,
  muokkaamaan niitä hallitusti sekä tuottamaan itse alkeellisia
  skriptejä mallin tai ohjeiden perusteella [ydin/arvos2]

- muistaa apuohjelmia ja keinoja, joilla unix-tyyppisen
  käyttöjärjestelmän hetkellistä tilaa voidaan tarkastella
  pääteyhteydellä ja/tai tekstimuotoisella kuorella; kykenee etsimään
  WWW:stä lisätietoa vastaavien tehtävien suorittamiseen ja arvioimaan
  kriittisesti ohjeiden laatua ja soveltuvuutta tarpeeseen [edist/arvos3]

Näitä viimeksi mainittuja tavoitteita viedään pidemmälle koko kurssin
135 tunnin kokonaiskeston ajan muiden asioiden rinnalla. Erityisesti
kaikki demot tehdään kuorella ja tekstimuotoisilla apuohjelmilla.


.. raw:: latex

    \pagebreak



.. raw:: latex

    \pagebreak


Merkinnät ja erikoisnäppäimet
=============================

- ``Ctrl-R`` tarkoittaa näppäinyhdistelmää, jossa painat Ctrl-näppäimen
  pohjaan ja sitten kirjainta ``R``.

- ``^R`` on usein käytetty muoto ``Ctrl-R``:stä

- ``C-r`` on myös mahdollinen kirjoitusmuoto Ctrl-napin ja r-näppäimen
  yhdistelmälle.

- Alunperin kirjoitin näihin demo-ohjeisiin ``R`` kun tarkoitin ihan
  vain R-näppäimen painamista, josta tulisi oikeasti pieni kirjain
  ``r``. Joissakin ohjelmissa eroa ei ole, mutta **useimmiten pieni ja
  iso kirjain ovat eri asioita!**

  Koetin korjailla ohjetta tältä osin 20.3.2019 ja lisää 7.4.2020,
  mutta en lupaa että onnistuin 100-prosenttisesti ...

- ``Alt-r`` tarkoittaa näppäinyhdistelmää, jossa painat Alt-napin
  pohjaan ja sitten kirjainta ``r``.

- ``M-r`` tarkoittaa Unix-dokumentaatioissa "Meta"-näppäimen
  käyttöä. Yleensä nykyvehkeissä Alt-näppäimen käyttö on sama
  asia. Jotkut pääteohjelmat eivät osaa lähettää Altia
  meta-näppäimenä, mutta usein voi näppäillä ``ESC`` eli Escape ja sen
  jälkeen kirjain, ja se tarkoittaa samaa. Pääteohjelman asetuksista
  voi myös löytyä valintoja siihen, miten "metan" lähettäminen
  pääteyhteyden yli saadaan aikaan.

Jotkut komennoissa tarvittavat merkit ovat hieman yllättäviä ja
harvemmin käytettyjä muualla kuin kuorissa. Lisäksi ne on joskus
vaikea erottaa toisistaan paperilta tai näytöltä. Tässä on
mallikappaleet vaikeammin toisistaan erottuvista erikoismerkeistä,
joita kuorissa käytetään::

    ~     Tilde, "mato"; tavallisesti Alt Gr:n ja sitten sen enterin
          vierestä löytyvän näppäimen yhdistelmänä. Tämän jälkeen
          pitää painaa vielä välilyöntiä, että varsinainen matomerkki
          tulee. Syy on se, että sen varsinainen merkitys on olla
          espanjalaistyylinen aksenttimerkki, esim. sanassa "mañana"
          Macissä: sama merkki löytyy näppäilyllä option + ¨ + välilyönti.

    ^     Sirkumfleksi, "hattu"; tavallisesti Shiftin ja enterin vierestä
          löytyvän näppäimen yhdistelmänä. Sama juttu: pitää painaa lisäksi
          välilyöntiä tai voikin tulla esim ê tai î ...

    "     Lainausmerkki, "double quote"

    '     Heittomerkki, "single quote"

    `     gravis eli vasemmalle kallistuva aksenttimerkki, "back-tick";
          tulee usein Shiftin ja BackSpacen vieressä olevan napin 
          yhdistelmänä. Tämäkin on àksènttimerkkì, joten pitää painaa 
          perään välilyöntiä. (Näin se on ohjelmoijan elämä tehty
          vaikeaksi suomalaisella näppäimistöllä...) Muista Shift, ettei
          tule vahingossa ´ eikä ` - ja huomaa, että nämä kaikki eri hipsut
	  ovat täysin eri merkkejä, vaikka näyttävät samankaltaisilta: ´ ` '

    |     Tolppamerkki; tulee yleensä näppäilemällä Alt Gr + vasemmasta 
          alakulmasta, jossa on suomalaisessa näppiksessä myös > ja <
          Macissä: option + 7

    \     Kenoviiva; yleensä Alt Gr + oikeasta yläkulmasta löytyvä jossa myös ?
          Macissä: shift + option + 7

    [     Hakasulku; Alt Gr + 8
          Macissä: option + 8

    ]     Vastaava sulku toisinpäin; Alt Gr + 9
          Macissä: option + 9

    {     aaltosulku;  Alt Gr + 7.
          Macissä: Shift + option + 8

    }     Vastaava sulku toisin päin; tulee yleensä näppäilemällä Alt Gr + 0
          Macissä: Shift + option + 9

    $     dollarimerkki; Alt Gr + 4
          Macissä: option + 4



Muita tavallisesti käytettyjä erikoismerkkejä ovat ``()<>*?#!;&$`` jotka
erottuvat toisistaan vähän helpommin.

Jos sinulla on piilevä lukivaikeus, joka liittyy samankaltaisten
merkkien erottamiseen toisistaan, saatat huomata sen esimerkiksi tällä
kurssilla. Ei huolta: 5-12 prosentilla väestöstä on sama ominaisuus,
ja kaikki pystyvät kyllä tekemään näitä asioita. Tällainen ominaisuus
on kuitenkin hyvä tiedostaa, koska silloin täytyy muistaa käyttää
enemmän aikaa ja keskittymistä merkkien tulkinnassa.



Varoituksia / ennen kuin aloitat
================================

Luennolla nämä samat varoitukset mainittiin/tullaan mainitsemaan,
mutta laitetaan ne tähän itseopiskelijoita varten. Komentorivikuorella komennat
tietokonetta erityisen suoraan ja tehokkaasti: Jos pyydät poistamaan
tiedoston, se HÄVIÄÄ! Ja jos kirjoitat jotain aiemman tiedoston
päälle, sen aiempi sisältö HÄVIÄÄ! Ja kun jotain hävisi, se EI TULE
TAKAISIN!  Mitään tuplavarmistuksia ei ole.

Älä pelkää kuitenkaan. Noudata ohjeita, niin kaikki menee hyvin ja on
mukavaa. Päivän analogia: Ranskanperunat on tehokasta uppopaistaa
rasvassa, joten uppopaisto on hyvä juttu. Vaikka sormien laittaminen
kuumaan rasvaan on pieni ja helppo liike, sitä ei saa tehdä sen takia,
että se on vaarallista eikä ollenkaan se asia, minkä haluat rasvan
avulla toteuttaa. Sama juttu pätee kuoren käytössä.



Pääsäännöt; muista aina
-----------------------

1. Ajattele ennen kuin kirjoitat!

   - aina on oltava täysin varma siitä, mitä komento tekee tai
     vähintään siitä, mitä keljua se ei varmasti ainakaan tee.

   - jos et ole varma, mitä komento tekee, lue manuaalia kunnes olet
     täysin varma.

2. Ajattele vielä kahdesti ennen kuin painat enteriä!

   - komento suoritetaan vasta sitten kun painat enteriä. Silloin on
     viimeinen hetki perua; enterin painamisen jälkeen väärän komennon
     tuhot tapahtuvat silmänräpäyksessä.

3. Älä päästä kissaa, lapsia tai vastaavaa näppäimistölle!

   - Apinalta menee käytännössä ääretön aika kirjoittaa Sheakespearen
     tuotanto satunnaisia näppäimiä painelemalla, mutta vahinko voi
     tapahtua yksinkertaisesti nuolinäppäimen ja enterin painamisella
     peräkkäin, mikä vaikuttaa jo vaarallisen todennäköiseltä
     yhdistelmältä.

4. Varo copy-pastaamasta shelliin mitään, koska teksti tulkitaan
   useina komentoriveinä. Vähintään on oltava absoluuttisen varma
   siitä, mitä leikepöydällä on ennen kuin lähtee liimaamaan sitä
   komennoiksi! (Rivinvaihdot tulkitaan entereiksi, eli joka rivistä
   tulee eri komento!)

5. Tee silloin tällöin varmuuskopiot korvaamattoman tärkeistä
   tiedostoista. (Vaikka et itse hukkaisi edes vahingossa mitään,
   laitevika saattaa periaatteessa tuhota tiedostosi milloin
   vain). Yliopiston kotihakemistostasi on (kai, ehkä) periaatteessa
   olemassa melko uusi automaattinen varmuuskopio, mutta tekniikkaan,
   kuten tähänkään, ei yleensä kannata luottaa
   100-prosenttisesti. Vähintään voit olla varma, että *mikrotuki ei
   tule olemaan iloinen siinä vaiheessa, kun varmuuskopioita täytyy
   lähteä kaivelemaan arkistonauhoilta*.

   Nykyään on tosi näppäriä pilvipalveluita varmuuskopiointia
   varten. Palveluiden ilmainenkin tila riittää oikein hyvin monien
   elintärkeiden tietojen tallentamiseen. Tässä kategoriassa on
   esimerkiksi hääkuvat ja muut rakkaat muistot.

   Lähdekoodi, opinnäytteet ja muut pääosin tekstimuotoiset työt on
   hyvä pitää versionhallinnassa niin, että silloin tällöin työntää
   muutoshistorian ulkoiseen pilvipalveluun. Tällä kurssilla ei ehditä
   opettaa versionhallintaa; sitä on ainakin tietotekniikan
   ohjelmointi- ja projektikursseilla ja asian voi myös opetella
   omatoimisesti. Mahdollisimman pian.

Pelottavia esimerkkejä
----------------------

- jos vahingossa antaisit komennon ``rm -rf *`` kotihakemistossasi,
  kaikki tiedostosi hukkuisivat iäksi. En suosittele.

- esimerkiksi, jos vahingossa antaisit komennon ``echo > gradu.docx``,
  tiedoston ``gradu.docx`` sisältö tuhoutuisi täysin. Ei kannata.

- jompikumpi edellisistä (tai joku muu pommi) saattaa lymytä
  leikepöydällä melkeinpä odottamassa, että vahingossa liität sen
  kuori-ikkunaasi.

- jompikumpi edellisistä (tai joku muu pommi) on saattanut juuri äsken
  olla tarkoituksellinen komento, ja se melkeinpä odottaa, että otat
  sen nuolinäppäimillä vahingossa komentohistoriasta. Tai kissasi ottaa.

- Tuplavarmistuksia ei ole, vaan kuori olettaa, että tiedät, mitä
  haluat. Siis vielä kerran: ole varma komennoistasi!

Kirjoittaja vastaa siitä, että tämän oppaan esimerkit ovat täysin
turvalliset **jos ne kirjoitetaan merkistä merkkiin sillä tavoin kuin
ne tässä annetaan**. Siihen vastaaminen loppuu. Älä siis sohlaa ellet
ymmärrä. Sitten kun olet varma siitä mitä sohlaat, se muuttuu jopa
suotavaksi.

Aluksi nämä varoitukset on ymmärrettävistä syistä annettava. Niistä
huolimatta tämän harjoituksen päätarkoitus on **vähentää
pelkokerrointa** ja tehdä yksi **tehokkaan automaattisen
tietojenkäsittelyn työkalu tutuksi ja turvalliseksi**. Mitään hätää ei
ole, jos noudatat yllämainittuja pääsääntöjä, etenkin numeroa yksi,
*"ajattele ennen kuin kirjoitat"*, ja viisi, *"pidä
varmuuskopiot"*. Toivon lukijalle tietoteknisen vapautumisen,
ymmärtämyksen luoman turvallisuuden sekä tehokkuudesta syntyvän riemun
kokemuksia, jollaisia interaktiivisen kuoren oppiminen itselleni
aikoinaan tarjosi!


Apua "paniikkitilanteissa"
--------------------------

" Apua! Painelen näppäimiä, mutta mitään ei tapahdu shellissä "

Jotkut normaalit tilanteet voivat näyttää siltä, että pääteyhteys tai
kuori jumittui eikä tee mitään. Alla on pieni ongelmanselvitysohje
pääteyhteydelle silloin, kun se "lakkaa vastaamasta".  Tärkeintä on
olla menemättä paniikkiin; näppäimiä ja varsinkaan enteriä ei saa
hakata hullun raivolla, koska voi tulla tuhoja (ks. varoitukset
edellä). Todennäköisesti kyseessä on ihan normaali ilmiö.

+ Yleisiä syitä:

  - Graafisen työpöydän fokus muualla kuin konsoli-ikkunassa (eli
    pääteyhteysikkunassa)?  Klikkaa konsoli-ikkunaa, ja katso
    auttaako. (Klikkaa vasemmalla hiirennapilla, koska muut napit
    saattavat vahingossa pastettaa jotakin päätteelle [ei
    kannata...]!)

  - ``Ctrl-s`` painettu vahingossa? Paina ``Ctrl-q``. Jostain syystä
    (veikkaan että historiallisena jäänteenä) on käytössä
    näppäinkomento ``Ctrl-s``, joka pysäyttää sinulle päin tulevan
    tulostuksen. Kaikki näppäinpainalluksesi kuitenkin välittyvät
    edelleen palvelimelle! Tulosteet jäävät jemmaan ja ne tuodaan
    puskurista kerralla sinulle sitten kun painat ``Ctrl-q``. Outo
    homma, mutta näin se toimii vielä tänäkin päivänä...

  - Ohjelma jumissa / ajo kestää liian kauan? Kokeile ``Ctrl-c``
    (stop) tai ``Ctrl-z`` (suspend) ja tarkista tila. Keinoja
    ohjelmien tilan hyvinkin tarkkaan tarkisteluun käydään läpi
    kurssin mittaan.

  - Väliaikaiset ongelmat palvelimella: Esimerkiksi keväällä 2014
    yliopiston suorakäyttökoneissa oli ulkopuolisista syistä johtuva
    ongelma, jonka vuoksi pääteyhteys tuntui "odotuttavan"
    satunnaisesti sisäänkirjautumisessa ja joskus myös yhteyden
    aikana. Viiveen kesto oli joistain sekunneista joihinkin
    minuutteihin. Ei ole tiettävästi ilmennyt uudelleen lähivuosina
    (tilanne 2019). Järjestelmissä voi kuitenkin tulla aina uusia
    ihmeellisiä ilmiöitä, joita sitten ihmetellään!

  - Oman talon verkkoyhteys poikki? Ei voi kuin odotella. (Tai voi
    kiljua palveluntarjoajan tukipalvelunumeroon ja lisäksi odotella.)

+ Harvinaisempia:

  - Etäkone kaatui / käynnistettiin uudelleen muistamatta ilmoittaa
    käyttäjille? Todennäköisesti varmistus ajaa koneen kohta
    ylös. Odottele. Toivottavasti automaattinen tallennus toimi, eikä
    tiedostojärjestelmä vioittunut sinun kotihakemistosi kohdalla.

  - Omassa koneessa / asennuksessa vikaa? Olet oman onnesi
    nojassa... onnea ylläpitotaidon opiskeluun tai kilauta
    nörttikaverille, joka on palveluksen velkaa...  Apua saattaa
    löytyä myös kurssia varten perustetulta vertaistukikanavalta, jos
    opiskelet samaa tahtia muiden kanssa.

  - Etäkoneessa viallinen asennus / buginen käyttöjärjestelmä tai
    kuori? Yritä rinnakkaista yhteyttä koneeseen ja tarkista
    jumittuneen kuoren tila prosessinhallintakomennoilla. (Näitä
    komentoja kertyy kurssin mittaan jonkinlainen joukko, pohjateorian
    ohella)

" Apua! Komentoni menevät läpi ja tulosteet tulevat, mutta en näe,
mitä kirjoitan. "

+ Itselleni on käynyt joskus näin; en yhtään tiedä, mistä se johtuu
  enkä osaa korjata. Yritä kirjoittaa sokkona komento ``exit`` ja
  ottaa yhteys uudelleen. Ja jos itse tiedät, miksi merkkien kaiutus
  voisi mennä rikki, kerro se heti mullekin! (Ei ole tapahtunut
  itselleni jotakuinkin vuoden 2011 jälkeen, joten todennäköisesti on
  ollut kyse sittemmin korjatusta ohjelmistovirheestä joko Windowsille
  tehdyssä pääteyhteysohjelmassa tai palvelimen
  pääteohjelmistossa... toivotaan, ettei ongelma tule takasin.)

" Täysi paniikki! Kaikki on jumissa! "

+ Niin, siihen paniikkiin yritä olla menemättä...

+ Jotkut ohjelmat voi olla pirullisia käyttää ennen kuin on lukenut
  niiden ohjeet. (Samoihin ohjelmiin saattaa ohjeiden lukemisen
  jälkeen lähes rakastua, koska ne ovat nii-in tehokkaita
  käyttää).

  Yksi esimerkki on Vi-tekstieditori, jossa pitää osata painella
  järjestyksessä näppäimet ``ESC`` ``:`` ``q`` ``!`` ja enter, että
  pääsee pois.

  Emacs-tekstieditorin poistumiskomento puolestaan on kahden peräkkäin
  painetun näppäimen yhdistelmä ``Ctrl-x`` ``Ctrl-c``. Muitakin ehkä
  voi tulla vastaan. (Kohteliaisuussyistä mainitsin ensimmäisenä vi:n,
  vaikka olen itse emacs-fani.)

+ Joskus ohjelmat kysyvät jotakin, johon pitäisi osata vastata
  jotakin. Jos et ole kiinnostunut opettelemaan asiaa manuaalista, tai
  ei ole aikaa, kokeile seuraavia näppäilyjä, jotka useissa ohjelmissa
  peruuttavat aloitetun interaktiivisen toiminnon:

    - ``ESC``

    - ``ESC`` pari kertaa peräkkäin

    - ``Ctrl-g`` -- tämä on aika tyypillinen "Cancel"-toiminnon
      näppäin

    - ``Ctrl-q`` tai ``Ctrl-c`` -- huomaa että nämä saattavat lopettaa
      koko ohjelman!

+ Viimeisenä keinona sulje vaan kylmästi pääteyhteysohjelma ja ota
  yhteys uudelleen. Normaalisti tähän pitäisi olla hyvin vähän
  tarvetta. Lieveilmiönä sessiot ja ohjelmat saattavat tällöin jäädä
  palvelimen puolella päälle ja lisätä muiden käyttäjien kokemaa
  kuormitusta.

  Kohteliasta on muutenkin tarkistaa välillä omien ohjelmien tilanne ja
  lopettaa tarpeettomat ohjelmat; tällä kurssilla opitaan peruskeinot
  omien palvelinresurssien käytön tarkkailuun ja kyky etsiä lisää
  ohjeita netin tutoriaaleista.

  Kurssin ensimmäisten päivien aikana voidaan hieman hihitellen
  hyväksyä, että aloittelijoilla on jäänyt juttuja jumiin
  suorakäyttökonetta kuormittamaan. Opetellaan tästä kuitenkin eroon
  mahdollisimman pian!



Tarkennuksia: Unix/Linux/GNU/BSD/...
====================================

Jos haluat vain päästä käsiksi harjoitteisiin, voit hypätä tämän luvun
yli. Tässä vähän halkaistaan hiuksia ja ylitarkennetaan, mitä olen
osannut kertoa, ja mitä kenties en.

Tämän kurssin käytännön harjoitteet toteutetaan Jyväskylän yliopiston
Digipalveluiden kaikille opiskelijoille tarjoamalla
suorakäyttökoneella nimeltä ``jalava.cc.jyu.fi`` tai vastaavalla
koneella ``halava.cc.jyu.fi``. Tätä kirjoittaessa (maaliskuu 2024) noissa
koneissa on käyttöjärjestelmäksi asennettu Red Hat Enterprise Linux
Server release 7.9 (Maipo), joka on niin sanottu Linux-jakelupaketti
eli "jakelu" tai "distribuutio" tai "distro". Päivityksiä tulee
silloin tällöin, joten tätä lukiessasi versio voi olla jo uudempi.

Jakelupaketti sisältää Linux-käyttöjärjestelmän ytimen sekä valikoiman
apu- ja sovellusohjelmia. Suurin osa apuohjelmista on erillisen
GNU-projektin (lyhenne "GNU" tarkoittaa "GNU's Not Unix") tuottamia,
ja alkuperäisohjelmiston tekijöiden mielestä tällaisesta
kokonaisjärjestelmästä tulisikin käyttää nimeä GNU/Linux eikä pelkkä
Linux, koska ytimen ympärille tehdyt apuohjelmat ovat merkitsevässä
roolissa järjestelmän käytön kannalta, eivätkä ne ole toiminnoiltaan
sidoksissa Linux-ytimeen.

Tällä kurssilla kuitenkin on kiinnostuksen kohteena varsinkin
käyttöjärjestelmän ydin, joka esimerkkinä käytettävissä
järjestelmissämme on Linux. Se on suomalaisen Linus Torvaldsin
1990-luvulla alullepanema käyttöjärjestelmäydin, joka pohjautuu
1970-luvulta saakka vahvasti vaikuttaneeseen
Unix-käyttöjärjestelmään. Molempien käyttöjärjestelmien, Unixin ja
Linuxin, erilaiset versiot ja muunnokset sekä niiden jakelupaketit
(sekä kaupalliset, kuten kyseinen Red Hat Enterprise Linux, että
ilmaiset, kuten Fedora, Ubuntu, Arch, Kali, ...)  elävät ja voivat
hyvin toistaiseksi ja näköpiirissä olevassa
tulevaisuudessa. (Edellinen lause kirjoitettu vuonna 2015 ja todettu
olevan yhä voimassa 2016 ja 2017 ja 2018 ja 2019 ja 2020 ja 2021 ja
2022 ja 2023 ja 2024).

Esimerkiksi valtaosa nykypäivän WWW-palvelinkoneista käyttää jotakin
Unixia tai Linuxia käyttöjärjestelmänä. Sama tilanne on
supertietokoneissa eli tieteellisissä "numeronmurskaimissa". Linux on
potentiaalinen käyttöjärjestelmä myös kännyköihin ja muihin
sulautettuihin järjestelmiin, joissa jonkin työkalun tai laitteen
toimintaa ohjataan sisäänrakennetulla, mahdollisesti ulospäin
näkymättömällä tietokoneella. Tällä hetkellä suosituin älypuhelinten
ohjelmistoalusta vaikuttaisi olevan Android ( tarkistettu muutamasta
Googlella löytyneestä eri statistiikasta viimeksi 21.3.2024 ), joka
sekin on rakennettu Linuxin ytimen päälle. Linux-osaamista arvostetaan
työmarkkinoilla.

Kurssin luennoilla sivutaan jonkin verran käyttöjärjestelmien
historiaa ja aivan muutamaa merkkipaaluksi jäänyttä toteutusta, mutta
niiden tarkempi sukupuu jää oman kiinnostuksen ja tiedonhaun
nojaan. Viidessä opintopisteessä on keskityttävä toisaalta
hyödyllisiin nykypäivän kädentaitoihin ja toisaalta nykyaikaisen
käyttöjärjestelmän toteutuksellisiin yksityiskohtiin, vaikka myös
historian tarkempi tunteminen olisi akateemisesti hyödyllistä.

Käytän joskus sanamuotoa "Unixissa tai ainakin Linuxissa", koska
jotkut asiat toimivat hieman eri tavoin Linuxissa kuin
muissa/aiemmissa Unixeissa, ja itselläni oli varsinaista kokemusta
lähinnä Linuxista, kun alunperin kirjoitin tämän demo-ohjeen. Eroja on
sitä enemmän, mitä monimutkaisemmasta työkalusta on
kyse. Perusperustyökalut, joita tässä oppaassa nähdään, ovat melko
yleismaailmallisia. Kuitenkin jossain kulkee raja siinä, mikä on
Perusperustyökalu, mikä on vain Perustyökalu, ja mikä ei sitten enää
ole "peruskalu" ollenkaan vaan enemmänkin itsenäinen ja erillisenä
toimitettava sovellus, joka ei ole yleinen osa kaikkia
jakeluita. Rajat vaikuttavat joskus häilyviltä, jolloin on parasta
tarkastella standardeja ja niiden noudattamista.

Tällä kurssilla silmäillään ainakin POSIX-standardia, jossa sovitaan
tiettyjä sääntöjä, joita kaikkien yhteensopivien järjestelmien tulisi
noudattaa. Sekä standardointi että toteutuksien tekeminen standardien
mukaiseksi on vaivalloinen prosessi. Täyden yhteensopivuuden
saavuttaminen lähes 4000-sivuiselle rajapintadokumentaatiolle on iso
homma, eivätkä kaikki järjestelmät siihen täysin pysty, eikä aina ole
tarpeenkaan. Aika saattaa ajaa ohi standardeista, ja järjestelmien
tekijöiden on tarpeen tuottaa omia laajennoksiaan, kunnes uusien
tarpeiden mukaiset ominaisuudet saadaan standardoitua. Esimerkkinä
tällaisesta ilmiöstä on Linuxin omat standardit, joissa toteutetaan
osia POSIXista, mutta myös muita ominaisuuksia.

GNU/Linux -jakeluiden mukana jaettavissa GNU-projektin työkaluissa on
myös paljon laajennoksia POSIXin edellyttämiin piirteisiin
nähden. POSIXin selailu antaa kuitenkin hyvän yleiskuvan "pienimmästä
yhteisestä nimittäjästä", jonka mukaisissa puitteissa toimimalla on
parhaat mahdollisuudet toimittaa alustariippumattomia
sovelluksia. Järkevässä järjestelmän kehityksessä vähintään pyritään
mukailemaan standardeja, koska silloin potentiaaliseen käyttäjäkuntaan
saadaan henkilöt ja sovellukset, jotka jo valmiiksi noudattavat
kyseisiä standardeja.

Mitä tämä esipuhemainen höperrys tarkoitti? Sitä, että

- Tässä oppaassa mainitut työkalut ovat ihan varmasti saatavilla, ja
  toimivat juuri tässä kerrotulla tavalla, jos käyttöjärjestelmänä
  jossakin on Linuxin Fedora -distribuutio, jota itse käytän, tai Red
  Hat Enterprise Linux Server release 6.7, jolla toimivaksi tämä demo
  on aikoinaan testattu.

- Monet niistä ovat melko varmasti saatavilla (tai ainakin pienellä
  vaivalla asennettavissa), jos käytät mitä tahansa muuta
  Unix-varianttia, joita on siis maailmalla paljon.

Ajattele tässä olevia esimerkkejä juuri vain esimerkkeinä, ja muista,
että opettelet olennaisempaa asiaa kuin joku tietty komento tai sen
argumenttien muoto: Opettelet *interaktiivisen kuoren käyttöä, sen
ideaa ja mahdollisuuksia, ja monen käyttäjän järjestelmässä toimimista
pääteyhteyden kautta*. Se on aina samanlaista vaikka komennot tai
syntaksit olisivat mitä!



Osa 1: Ota pääteyhteys yliopiston IT-palveluiden koneelle
==========================================================

Tässä pikaintrossa oletetaan seuraavat asiat:

  - Toimit joko Agoran mikroluokassa tai muualla, missä käytössäsi on
    esimerkiksi Windows -käyttöjärjestelmä sekä SSH-kelpoinen yhteysohjelma.

    Vuonna 2020 tehtiin Windows-käyttäjille ohjevideo siitä, miten
    Powershelliin saa asennettua samanlaisen ssh-ohjelmiston. Windows
    10:n perusohjelmistoon se taitaa kuulua jopa ilman
    lisäasennusta. Asia kannattaa varmistaa.
    
    Windowsille on saatavilla myös erillisiä ssh-asiakasohjelmia kuten
    KiTTY Client tai PuTTY SSH Client, jotka saa netistä ilmaiseksi.

    Linuxissa ja Maceissä on valmiina yhteysohjelma, joka käynnistyy
    omalta komentoriviltä komennolla ``ssh yotunnuksesi@halava.cc.jyu.fi``.

    Joitain merkkien välittymiseen ja kuvaruudun päivittymiseen
    liittyviä ongelmia havaittiin Windowsilta tehtäessä
    keväällä 2020. Yksi kiertotie näihin oli vaan asentaa PuTTY ja
    käyttää sitä. Sitten kuitenkin löysimme myös toisen keinon, joka
    on unohtunut. Jos ongelma ei ole korjautunut Windowsin
    ohjelmistopäivitysten myötä, niin etsitään korjaus yhdessä
    uudelleen vertaistukikanavalla keskustellen, kuten
    viimeksikin... sen voi sitten päivittää tähän kohtaan ohjetta, kun
    löytyy.

    Toiminnan etäyhteydellä pitäisi näyttää samalta kuin
    luentovideoilla. Jos niin ei ole, pitää asia selvittää ja
    korjata. Vertaistukikanavalle siis kysymään, jos jokin ei näytä
    oletuksen mukaiselta.


  - HUOMIO: Etäkoneemme käyttävät merkistön koodaukseen oletuksena
    Unicoden "UTF-8" -muotoa, joka on syytä laittaa päälle omista
    asetuksista!  Muuten tulee isoja ongelmia suomenkielisten
    ääkkösten ja monien muidenkin merkkien kanssa!

  - Olet Jyväskylän yliopiston opiskelija, jolloin sinulla on
    käyttöoikeus IT-palveluiden suorakäyttökoneille. Käyttäjätunnus ja
    salasana on sinulle joskus jaettu.

    Jos näin ei kohdallasi ole, ota yhteyttä, niin mietitään
    ratkaisua...

  - Huom: Unix-koneiden käyttö täytyy aktivoida erikseen; ohjeet ovat
    tuossa alla. Aktivoinnissa on tekninen prosessointiviive (kuulemma
    noin 30-60 minuuttia), jonka aikaa on odotettava ennen kuin demoja
    voi alkaa tekemään.

Seuraavassa käytetään yhteysohjelmana KiTTYä (toiminee PuTTYssä
samalla tavoin). Varo tosiaan copy-pastea; hiiriklikkaukset näyttävät
toimivan KiTTY-ohjelmassa "Linux/X-mäisesti" mikä voi
Windows-käyttäjää ihmetyttää: Jo pelkkä maalaaminen ikkunassa tekee
välittömästi kopion leikepöydälle, ja oikeanpuoleinen nappi liittää
leikkeen sisällön ikään kuin se kirjoitettaisiin tekstinä
näppäimistöltä!

Jos tämä on ensimmäinen kerta ikinä
-----------------------------------

Digipalveluiden ohjeen mukaisesti sinun pitäisi ensin käydä
aktivoimassa Unix-tunnus WWW-osoitteessa https://sso.jyu.fi/ jos et
ole sitä aiemmin tehnyt:

  + Linkki "Oma - omien tietojen hallinta"

  + Sieltä linkki "Palvelut"

  + Ruksi ruutuun "Unix-suorakäyttöpalvelimien kirjautumisoikeus"

  + Sitten "Tallenna".

.. Varmista, että interaktiiviseksi shelliksi on valittu ``bash`` eli jos
   kohdassa "Account Info" ei ole "Shell" -rivillä "bash", niin käy
   vaihtamassa:

    + Klikkaa "Change Account Info", vaihda kohtaan "Shell" valinta
      "bash".

.. Tämä ``bash`` eli Bourne Again Shell on nykyinen oletusasetus,
   mutta joillakin vanhemmilla opiskelijoilla se on mahdollisesti
   ollut jotakin muuta. Nykyään kannattaa käyttää bashiä, mm. koska
   suurin osa netistä löytyvistä Unix-ohjeista on juuri bashin käyttöä
   ajatellen tehty. Bash toteuttaa POSIX-standardin kuoriosuuden,
   mutta sisältää laajennoksia, joiden käyttö voi olla perusteltua,
   mikäli jokin asia hoituu niillä paljon helpommin kuin
   POSIX-osajoukolla. (Tämän kurssin demot on aikoinaan tehty suoraan
   bashillä, eivätkä ne välttämättä rajoitu POSIX-ominaisuuksiin;
   yhteensopivuus on jatkuvalla TODO-listalla; tehtävässä saa
   auttaa...)

Sitten pitäisi olla Unix-etäyhteys käytettävissä. Saattaa myös olla
jonkinlainen prosessointiviive ennen kuin palvelu
aktivoituu.

Näillä ohjeilla on havaintojen perusteella onnistuttu hyvin vuosina
2019 ja 2020. Aina voi tulla uusia ihmeellisiä ilmiöitä, joista
kannattaa tarkkailla tilannetta ja vaihtaa kokemuksia vaikkapa kurssin
vertaistukikanavilla.

.. Systeemit ovat taas muuttuneet aivan äskettäin (tilanne v. 2019),
   joten meidän täytyy nyt tarkkailla tilannetta ja vaihtaa kokemuksia
   vaikkapa kurssin keskustelusähköpostilistalla. (Vuonna 2020 ei
   ilmennyt tällaisia ongelmia - demon alkuun näytti pääsevän ihan
   tuon ohjeen mukaan)


Seuraavaksi:

- Etsi ja käynnistä KiTTY SSH Client -ohjelma (tai muu valitsemasi
  SSH-asiakasohjelma)

- Kirjoita etäkoneen osoitteeksi ``jalava.cc.jyu.fi`` tai
  ``halava.cc.jyu.fi`` ja klikkaa "Open"

- Ensimmäisellä kerralla tulee dialogi-ikkuna, jossa kysytään,
  hyväksytkö etäkoneen Host Key:n. Se ei (ehkä, välttämättä,
  toivottavasti) tällä kertaa tarkoita, että joku vakoilisi
  tietoliikennettä, vaan sitä, että Jalavan isäntäavainta ei ole vielä
  tallennettu paikalliselle tietokoneelle. Voinet klikata
  hyväksyvästi. Jos joku ilkeä yrittää napata tietoliikennettä, tämä
  varokeino kertoo tarkkasilmäiselle käyttäjälle siitä. Normaalisti
  tämä tulee vain ensimmäisellä yhteyskerralla tai silloin, kun
  isäntäkoneella on esim. niin suuri päivitys että avain vaihdetaan.

- Kirjoita käyttäjätunnus, kun kysytään ``login as:``

- Kirjoita yliopiston salasanasi, kun sitä kysytään, eli tulostuu
  ``password:`` (huomaa, että salasanan merkkejä ei kaiuteta näkyviin
  päätteellesi, tietenkään)

.. - Jossain vaiheessa voit tutustua kirjautumisen yhteydessä mainittuun
    infosivuun

    + http://www.jyu.fi/thk/ohjeet/how-to-nain-tehdaan/suorakaytto-unix

     ... Tämä demo-ohje tosin kertoo enemmän kuin tuo sivu ainakaan
      vuonna 2014 kertoi (tai 2015 tai 2016 tai 2017 tai 2018...).

    Ja vuonna 2019 kyseinen sivu ei kertonut mitään..



Osa 2: Tutustu etäympäristöösi
==============================

Nyt tutustut kuoren käyttöön kirjoittamalla komentoja, jotka
tulostavat tietoja siitä tietokoneesta, johon olet yhteydessä.
Jokaisen komentorivin jälkeen pitää tietysti painaa enter. Komennot
ovat lyhyitä aluksi. Loppua kohti tehdään pidempiä ja pidempiä.
Mutta lähdetään liikkeelle perusasioista.

HUOM: Syntaksi on hyvin tarkka aina välilyöntejä myöten! Eli tarkkana
esimerkkien välilyönneissä ja erikoismerkeissä. Isot ja pienet
kirjaimet ovat myös merkityksellisiä, esim. ``S`` on eri merkki kuin
``s``.

Kuka olet, missä olet
---------------------

**Kuka olet?**

Komenna::

  whoami

Mitä tapahtui? Kuori kertoi, kuka sinä sen mielestä olet. Eli
käyttäjätunnuksesi tulostui.

**Missä olet?**

Komenna::

  uname -n

**Millainen paikka se on?**

Komenna::

  uname -nmo

Tämä kertoo millainen prosessori ja minkä tyyppinen unix etäkoneessa
on. Vielä lisää tietoa::

  uname -a


Keitä muita on paikalla?
------------------------

Komenna::

  who

Koeta tulkita tulostetta. Havainnet, että ``who`` kertoo, mitkä muut
käyttäjätunnukset ovat tällä hetkellä kirjautuneina koneelle. Se
kertoo myös, milloin kukin käyttäjä on kirjautunut ja minkä nimiseltä
tietokoneelta yhteys on otettu. Jokainen koneeseen otettu yhteys näkyy
yhtenä rivinä.

Huomaa käyttäjän näkökulma moniajoon: Eikö vaikutakin siltä kuin itse
olisit ainoa joka käyttää tietokonetta, vaikka Jalavan prosessoreita
käyttää kovin moni muukin yhtäaikaa! Tämä kokemuksesi on yksi
nykyaikaisen käyttöjärjestelmän tavoitetilanne. (Ja pääteyhteydessä
voi kyllä joskus havaita tiettyä "tökkimistäkin", joka saattaa johtua
esimerkiksi etäkoneen suuresta käyttöasteesta. Teoria ja käytäntö
tähän liittyen tulevat tutuiksi tällä kurssilla.)

Kaikki nimet tuskin mahtuivat yhteen kuvaruudulliseen. Kokeile
pääteohjelmasi vieritys-ominaisuutta. Jossain kohtaa ikkunaa on
luultavasti vierityspalkki, josta näet ohi vilahtaneet rivit.  Voi
myös olla, että esim. näppäinyhdistelmä ``Shift+Page Up`` antaa
edellisen sivun tulosteesta ja ``Shift+Page Down``
seuraavan. Tulosteita tallentavan puskurin koko on rajoitettu, joten
ihan vanhimmat rivit häviävät sitä mukaa kun uusia tulee. Puskurin
kokoa voi luultavasti säätää oman yhteysohjelmasi asetuksista.

Komenna::

  who | less

Nyt jouduitkin uuteen tilanteeseen! Ensinnäkin käynnistit kaksi
ohjelmaa yhden sijasta. Minkä tahansa ohjelman tulosteen voi ohjata
minkä tahansa toisen ohjelman syötteeksi käyttämällä tolppamerkkiä ``|``
yllä olevalla tavalla. Tätä sanotaan putkittamiseksi. Ohjelmien
välille muodostuu **putki** (engl. *pipeline* t. *pipe*), jota pitkin
data kulkee ohjelmalta toiselle. Asiaan palataan myöhemmässä osiossa.

Lisäksi viimeksi käynnistämäsi ohjelma ``less`` on itsessään
interaktiivinen. Sen tarkoitus on näyttää pitkä teksti pieni pätkä
kerrallaan. Tällaista ohjelmaa sanotaan sivuttajaksi
(engl. *pager*). Lessillä tulostetta voi selata nuolinäppäimillä ylös
ja alas. **HUOM:** Less-ohjelmasta pääsee pois näppäilemällä ``q``.

Kun olet tyytyväinen, näppäile siis ``q`` lopettaaksesi
less-ohjelma. Sen jälkeen olet taas aiemmassa tilanteessa, jossa kuori
odottaa seuraavaa komentoa.

Pääteyhteydellä ei siis tarvitse käyttää pelkästään kuorta tai
yksinkertaisia apuohjelmia. Mitä tahansa tekstimuotoisia ohjelmia (tai
siis niin sanottuja konsoliohjelmia) voidaan käynnistää ja käytellä
pääteikkunassa. Ja jos etäkoneella ja omalla koneella on yhteinen
ikkunointijärjestelmä, voi nopean nettiyhteyden yli kuljettaa
grafiikkaakin.

(POSIX-huomautus: ``less`` tarjoaa enemmän ominaisuuksia kuin POSIXin
edellyttämä sivuttaja ``more``, mm. selaamisen edestakaisin, joten
käytetään tällä kurssilla mukavuussyistä lessiä eikä
morea. Tarvittaessa voi asettaa ympäristömuuttujan nimeltä
``LESS_IS_MORE`` sisällöksi ``1``, jolloin less muuttuu
POSIX-yhteensopivaksi ja käyttäytyy kuten more. Ympäristömuuttujista
puhutaan kurssilla lisää myöhemmin.)

.. Päivityksessä 2024 suorakäyttöneilta on poistunut finger -asennus,
   mutta me ei ehkä sitä kaipailla takaisin. On ollut vähän
   tarpeettoman helppo listata tuhansia käyttäjätunnuksia ja nimiä
   jopa vahingossa ... Jätän osion kommentteihin, mutta eiköhän tämän
   voi ihan deletoidakin.

    **Kuka on kukin?**

    Komenna::

      finger

    Tarkkaile, miten tuloste on erilainen kuin edellä ``who`` -komennon
    tulostama. Jos haluat, voit käyttää sivuttajaohjelmaa ``less``
    jälleen putken avulla (ja less -ohjelmasta tosiaan pääsee pois näppäilemällä ``q``)::

      finger | less

    Valitse joku kirjautuneista käyttäjätunnuksista tai joku tuntemasi
    kaveri/opettaja, ja katso, mitä saat tietää hänestä
    palvelimelta. Esim. komenna::

      finger -m nieminen

    Huomaa, että tässä tarkoitetaan käyttäjätunnusta eikä oikeata
    nimeä. (Aikoinaan voitiin ottaa käyttäjätunnukseksi vaikkapa oma
    sukunimi, jos kyseinen tunnus sattui olemaan vapaana, mutta nykyään
    tämä ei ole enää käytäntönä). Käytä fingeriä joka tapauksessa ainakin
    käyttäjätunnukseen ``nieminen``. Huomaat, että siellä näkyy käyttäjän
    itsensä asettamia tiedotuksia. Jokainen voi asettaa näitä itselleen
    tietyllä tapaa, mutta ei käsitellä asiaa tässä tarkemmin. (Jos jossain
    vaiheessa asetat itsellesi ``.plan`` -tiedoston, pidä tarkoin huolta
    hakemistojesi käyttöoikeuksista, ja ymmärrä niiden vaikutus. Tällä
    kurssilla opitaan tästä perusteet viimeistään luennolla, joka
    käsittelee tiedostojärjestelmiä.)


**Mitä kukin tekee?**

Komenna::

  ps -ef

Mitä tapahtui? Komento tulosti kaikkien käyttäjien kaikki käynnissä
olevat ohjelmat. Niitäkin on luultavasti aika monta koko ajan. Älä
vielä tässä vaiheessa huoli siitä, mitä kaikki tulosteen tiedot
ovat. Ne selviävät varmasti Käyttöjärjestelmät -kurssin edetessä yksi
asia kerrallaan. Ensimmäinen sarake on käyttäjätunnus ja viimeinen on
se komento, jolla käyttäjä käynnisti ohjelman. Huomannet, että
``root`` -niminen käyttäjä on käynnistänyt paljon
``sshd``-ohjelmia. Itse asiassa tämä on sitä, kun käyttöjärjestelmän
valtuuksin (root) toimiva SSH-palvelin on käynnistänyt login-kuoria
etäyhteyksille. Sinullekin pitäisi tällä hetkellä löytyä tuollaiset
rivit ``ps``:n tulosteesta.

Tuloste oli varmasti pitkä. Kertaava harjoite: Putkita tuloste
less-ohjelmalle ja selaile sitä edestakaisin; lopeta less, kun siltä
tuntuu.

Tietoturvaan liittyvä huomautus: Annetut komennot ovat julkisia muille
käyttäjille, kuten huomaat. Niihin ei siis kannata kirjoitella järin
suuria salaisuuksia!

Mitä omistat täällä?
--------------------

(Tai siis millainen paikka sinulla on täällä lainassa yliopistolta
opintojesi ajan). Komenna::

  pwd

Jos mitään ihmeellistä ei ole tapahtunut, olet yhä kotihakemistossasi,
johon sisäänkirjoittautumisen jälkeen kuoressa päästään. Komento
``pwd`` kertoo nykyisen oleskeluhakemiston. Se on jotain vastaavaa
kuin ``/nashome3/nieminen``.

..  (tai ehkä jossain on joku asetus, jolla voi määrätä shellin
    aloituksen eri paikkaan kuin kotihakemisto; en tiedä, koska en ole
    koskaan tarvinnut sellaista ominaisuutta) .. tämä lienee jotakin,
    mikä selviää kyllä speksistä tasan tarkkaan.. ei oo ehtinyt
    selvittää... okei, mutta kyllä on ihan hyvä idea jokaiselle, että
    tarkistaa shellin aloitushakemistoksi $HOMEn jne. Parempi
    niin. Vähempi ongelmaa niin. OK.

Huomaa, että Unixissa hakemistonimissä on hakemistojen erottimena
kauttaviiva ``/`` kun taas Windowsissa kenoviiva ``\`` palvelee
vastaavaa tarkoitusta.

Unixin tiedostojärjestelmän "juuri" on hakemisto ``/`` eli pelkkä
kauttaviiva. Koko hakemistorakenne jäsentyy siitä alkaen. (Tällainen
rakenne voi olla joltain kantilta katsoen suoraviivaisempi ja
loogisempi kuin esimerkiksi eri juuren antaminen eri "levyasemille"
eli ``A:``, ``B:``, ``C:`` jne.)

Komenna::

  ls

Pitäisi tulostua kotihakemistosi sisältö. Huomaa, että se on sama kuin
``U:`` -asemasi yliopiston Windows-koneilla. Kumpikin hakemistopolku
viittaa samaan paikkaan jaetulla verkkolevyllä (engl. *network
attached storage, NAS*). Fyysinen kovalevy voidaan siis jakaa ihan eri
käyttöjärjestelmien ja tietokoneiden välillä! Voit hyvin olla
kirjautuneena useaan tietokoneeseen, joissa kaikissa näet yhden ja
saman verkkolevyn sisällön ikään kuin se olisi yksi paikallisen koneen
levy (tai itse asiassa hakemisto). Verkkoyhteyden pätkiessä
verkkolevyn tietoja ei tietenkään voi lukea eikä kirjoittaa.



Mitä täällä voi tehdä
---------------------

Ensinnäkin voit huutaa ja katsoa, miten kaiku vastaa (mutta "huuda"
toistaiseksi esimerkin mukaisesti ilman huutomerkkiä, koska
huutomerkillä ``!`` on erikoismerkitys kuoressa). Komenna::

  echo Miten kaiku vastaa

Komento ``echo`` ei tee muuta kuin tulostaa omat argumenttinsa. Se on
erityisen hyödyllinen esim. skripteissä, joiden halutaan ehkä
tulostavan jotakin. Skriptin suorittama "kaiku" päätyy nimittäin
esimerkiksi käyttäjälle, joka suoritti skriptin. Tai se voi tallentua
lokitiedostoon (kohtapuoleen katsotaan, miten echon tai minkä tahansa
ohjelman tulosteet voi kirjoittaa tiedostoihin; tulosteen ohjaaminen
toisen ohjelman syötteeksi putken avulla nähtiin jo edellisessä
esimerkissä. Kertaa, jos ei muistu heti mieleen! Tee itsellesi tarpeen
mukaan muistiinpanoja!).

.. Tästä tulin toisiin aatoksiin, eli otetaanpa eri asiana demo 2:ssa
   niin tuota kommentoin pois tästä kohtaa demo 1:tä kuitenkin..

   Sitten koetetaan unohtaa äskeinen, ja opetellaan käyttämään
   tulostamiseen aina komentoa ``printf``. Tuo ``echo`` on nimittäin
   nykyisessä POSIX-standardissa merkitty välteltäväksi (eli
   *deprecated*) ja suositellaan korvattavaksi komennolla
   ``printf``. Keväällä 2024 osa tehtävistä voi vielä olla
   päivittämättä nykyaikaan, mutta voit itse tehdä sen. Esimerkiksi
   äskeisen komennon tilalla pitäisi olla mieluummin tämä::

     printf "Mitä printf tekee\n"

   Huomaa lainausmerkit ja lopussa oleva kenoviiva ja än-kirjain.

Tekstitiedostojakin täällä voi tulostaa päätteelle. Komenna::

  cat /etc/group

Komento ``cat`` on sellainen, että kun sille antaa argumenttina
tiedoston nimen, se lukee tiedoston ja tulostaa sen
sisällön. (Mahdollista on myös "katenointi" eli usean tiedoston
tulostaminen peräkkäin; siitä tulee ohjelman nimi ``cat``. Se ei
valitettavasti liittynytkään kissoihin.)

Esimerkin tiedosto ``/etc/group`` löytyy joistakin
järjestelmistä, kuten meidän suorakäyttökoneiltamme, vaikkei se olekaan
laajemman standardin määräämä. Se on tietyn muotoinen tekstitiedosto,
joka kertoo koneelle määritellyt käyttäjäryhmät.

Näinkin pitkä teksti olisi ehkä parempi lukea interaktiivisella
``less``-ohjelmalla kuten edellä tehtiin. Aiemmassa esimerkissä
käytetyn putkituksen sijasta tiedoston voi kertoa lessille suoraan
argumenttina::

  less /etc/group

(Edelleen, lessistä pääsee pois painamalla ``q`` -näppäintä.)

Vielä yksi. Komenna::

  cat /proc/cpuinfo

Tämä kertoo yksityiskohtaista tietoa etäkäyttökoneen prosessoreista,
joiden toiminta ja käskykanta ovat yksi tämän kurssin
teemoista. Huomataan, että toistaiseksi (tarkistettu keväällä 2024)
kone ``jalava.cc.jyu.fi`` näyttäytyy meille neliytimisenä Intel Xeon
-prosessorina, jonka virtuaaliosoitteet ovat 48-bittisiä ja fyysiset
osoitteet 43-bittisiä.

Välihavainto: Ilmeisesti ainakin tällaisia peruskomentoja kuin
``echo``, ``cat``, ``less`` löytyy, ja niiden tulosteita voi ohjata
putken kautta syötteeksi toisilleen. Mitäs muuta etäkäyttö-Unixilla
voi tehdä?

Komenna::

  ls /bin/

Tulostui reilu 3005 kappaletta apuohjelmia (lukumäärä tsekattu
viimeksi vuonna 2024). Tutki listaa; löydätkö tähän asti kokeilemiesi
komentojen nimiä?  Vuonna 2024 Jyväskylän yliopiston
suorakäyttökoneilla hakemisto on näköjään käytännössä sama kuin
``/usr/bin`` eli seuraava komento antaa meillä saman tulosteen::
  
  ls /usr/bin/

Hakemisto ``/bin`` on tyypillisesti Unixissa perusapuohjelmien
sijainti ja ``/usr/bin`` lisättyjen, paikallisesti asennettujen,
sovellusten sijainti.

Muistanet, mistä kaikki suoritettavat ohjelmat tulevat: ne on jossain
vaiheessa käännetty lähdekoodista konekieliseksi
binääritiedostoksi. ``bin``-nimisissä hakemistoissa on usein sellaisia
ja lisäksi tulkattavia ohjelmia kuten shell-skriptejä. Jokainen voi
tehdä itselleen oman kotihakemiston alle kokoelman omia ajettavia
ohjelmia ja skriptejä (esimerkiksi itselläni on tehtynä
``/nashome3/nieminen/bin``).
   
.. Nämä ohjelmat löytyvät melko varmasti kaikista unixeista, ja
   melko varmasti ne löytyvät kaikkialla nimenomaan hakemistosta
   ``/bin``. 

   Sitten laajennetaan näkökulmaa... pidä tuolista kiinni, kun komennat
   seuraavan.

Yleisimmille Linux-distribuutioille on saatavilla yli 5000 valmiiksi
paketoitua ohjelmaa (joillekin vielä enemmänkin), joilla voi tehdä
kaikenlaista. Jyväskylän yliopiston digipalveluiden porukka on
valinnut jonkinlaisen harkinnan perusteella etäkäyttökoneisiimme
asennettavaksi juuri nuo siellä olevat 2900+ ohjelmaa. Ohjelmien
paketoinnista vastaa distribuution toimittaja (meidän
suorakäyttökoneidemme osalta yritys nimeltä Red Hat) sekä, erityisesti
vapaan lähdekoodin maailmassa, vapaaehtoiset apulaiset. Jos
distribuution toimittaja ei ole jotakin tarpeellista ohjelmistoa
paketoinut, se jää paikallisen ylläpitohenkilöstön tehtäväksi, meillä
siis Jyväskylän yliopiston digipalveluiden.

Turha varmaan yrittää käydä läpi kaikkia noita tuhansia
ohjelmia. Ennemmin kannattaa ehkä keksiä, mitä haluaisit tietokoneella
tehdä, ja sitten etsiä Internetistä jollain hakusanoilla tieto siitä,
minkä nimisellä ohjelmalla se voidaan Linuxissa tehdä. Tai kysy
kokeneemmalta Linux-käyttäjältä vinkkiä. Vaikka onhan mahdollista
tutustua mielenkiintoisen nimisiin ohjelmiin
sattumanvaraisestikin. Seuraavassa osuudessa katsotaan, miten
käyttöohjeet ovat kuoressa aina lähellä. Ennen sitä kerrataan
kuitenkin havainnot kuoresta tähän asti:

- Kuori antaa sinun kirjoittaa komennon ja odottaa että painat
  enter-näppäintä.

- Sitten kuori suorittaa komennon. Usein se on jonkun ohjelmatiedoston
  nimi ja ohjelmalle välitettävä argumenttilista.

- Argumenteista muodostuu siis lista. Eri argumentit erotetaan
  toisistaan välilyönnillä.

  Esimerkiksi C#:lla tai Javalla tehty ohjelma vastaanottaa argumentit
  ``main``-metodin ``String[] args`` parametrissa. C-kielellä tehty
  taas saa erikseen lukumäärän ja varsinaiset merkkijonot, kuten
  tämän kurssin C-kielisissä esimerkeissä tullaan näkemään.

- Jos yhteen argumenttiin haluaa sisällyttää välilyönnin, se on
  mahdollista, mutta se pitää koodata eri tavoin, koska muuten
  välilyönti tulkitaan eri argumenttien erottimena. Pari mahdollista
  tapaa::

      jokukomento argum1 "argum2 jossa on välilyöntejä" argum3

      jokukomento argum1 'argum2 jossa on välilyöntejä' argum3

      jokukomento argum1 argum2\ jossa\ on\ välilyöntejä argum3

  Kaikki kolme tämän esimerkin komentoriviä ovat olennaisesti samoja. Jokainen
  niistä ilmoittaa komennolle ``jokukomento`` kolme argumenttia:
  Ensimmäinen on ``argum1``. Toinen on ``argum2 jossa on välilyöntejä``.
  Kolmas on ``argum3``.

  Esim. komento::

      java JokuLuokka risto "aliisa lassi" pena

  aiheuttaa Javalla kirjoitetun metodin JokuLuokka.main() alkuun tilanteen, jossa pätee::

      args[0].equals("risto") == true
      args[1].equals("aliisa lassi") == true
      args[2].equals("pena") == true

  Ja edelleen, jos argumentissa on oltava sisällössä merkki ``"`` niin
  se pitää koodata ``\"``. Samoin ``'`` koodataan ``\'``. Tietyt
  kuoren erityismerkit on pakko koodata vastaavalla tavoin
  kenoviivasyntaksilla. Puhutaan "escape sequencesta", olisiko tämä
  sitten suomeksi "eskeippimerkki" tai "pakomerkki", jolla siis
  "paetaan" yhden merkin ajaksi normaaleista tulkintasäännöistä.

  Tämä on sama periaate kuin useissa ohjelmointikielissä
  esimerkiksi rivinvaihdon tai tabulaattorimerkin koodaus vakiomerkkijonossa
  (rivinvaihto ``\n``, tabulaattori ``\t``).

  Ohjelmointi 1 -kurssimme jälkeen tutuimmassa kielessä, C#:ssa,
  tapahtuu samat asiat pienin syntaktisin eroin.

- Ohjelman ns. "valitsimet" (engl. *options*) ovat
  Unix/Linux-maailmassa usein argumentteja, joiden muoto on ``-v`` tai
  ``--verbose`` eli niissä on tavuviiva ja kirjain tai
  vaihtoehtoisesti kaksi tavuviivaa ja kuvaavampi
  sana. Yksikirjaimisia argumentteja saa useimmiten yhdistää
  peräkkäin: Esimerkiksi voi kirjoittaa ``-xvz`` sen sijaan että ``-x -v
  -z``, paitsi jos jokin valitsin edellyttää että seuraava argumentti
  on esimerkiksi tiedostonimi tyyliin ``-o outputfilename``. Argumenttien
  käsittely on täysin ohjelmasta riippuvaa, ja ohjelman
  käyttöohjeisiin täytyy tutustua ennen kuin lähtee sitä
  käyttämään. POSIX määrittelee yhteensopivassa järjestelmässä
  välttämättömät apuohjelmat sekä niiden välttämättömät argumentit
  muotoineen.

  (Windows-maailmassa usein valitsimet ovat yksikirjaimisia ja alkavat
  kauttaviivalla.)

- "Interaktiivinen kuori" tarkoittaa tätä, että editoit aina yhden
  komennon kerrallaan interaktiivisesti. Toinen tapa käyttää kuorta on
  skriptit, joissa kuori suorittaa peräkkäin ohjelmaksi kirjoitettuja
  komentoja. Puhutaan kuoriohjelmoinnista (tai helposti myös
  "shell-ohjelmoinnista", kun kielipoliisin korva välttää) tai
  skriptien tekemisestä. Kuori voidaankin siinä mielessä ajatella
  tulkattavaksi ohjelmointiympäristöksi, vaikka se on
  ohjelmointimielessä hiukan köykäinen oikeisiin ohjelmointikieliin
  verrattuna.




Osa 3: Opi, miten opit lisää milloin vain
=========================================

Komenna::

  man ls

Tämä näyttää apuohjelman ``ls`` manuaalin eli
käyttöohjeen. Perusasetuksilla manuaali näyttää pitkän tekstinsä
käyttämällä ``less``-ohjelmaa, johon tutustuit edellisessä
kohdassa. Muistanet, että tekstiä voi selata ylös ja alas
nuolinäppäimillä, ja less-ohjelmasta ja manuaalistakin pääsee pois
painamalla ``q``-näppäintä. Kokeile.

Ohjelman ``ls`` man-sivun eli käyttöohjeen alku sisältää tällaista::

    NAME
           ls - list directory contents

    SYNOPSIS
           ls [OPTION]... [FILE]...

    DESCRIPTION
           List information about the FILEs (the current directory by
           default).  Sort entries alphabetically if none of -cftuvSUX
           nor --sort.

           Mandatory arguments to long options are mandatory for short
           options too.

           -a, --all
                  do not hide entries starting with .

           -A, --almost-all
                  do not list implied . and ..

           --author
                  with -l, print the author of each file
    
           ...


Ja tällaisiapa man-ohjeet yleensä ovat. Niissä kerrotaan ohjelman nimi
ja tarkoitus (NAME). Sitten kerrotaan tapa, jolla ohjelmaa saa
komentaa (SYNOPSIS); eli komennon jälkeen voi yleensä antaa tietyssä
järjestyksessä tietynlaisia argumentteja, joista osa voi olla
pakollisia ja osa ei-pakollisia. Ei-pakolliset on kirjoitettu
hakasulkeisiin. Tässä tapauksessa komennon perään voi laittaa
tarkentimia, OPTION, jotka ovat siis vapaaehtoisia, koska [OPTION] on
hakasulkeissa. Tarkentimien jälkeen voi olla tiedoston tai hakemiston
nimi FILE, joka siis sekin on vapaaehtoinen. Molempia voi olla monta,
mikä synopsikseen on merkitty kolmella pisteellä ``...``.  Näiden
jälkeen kuvaus (DESCRIPTION) kertoo tarkemmin, mitä ohjelma tekee. Ja
sitten alkaa tarkentimien kuvaus. Yleensä ohjelmilla on mahdollisia
tarkentimia aika paljon, riippuen kuinka monipuoliseen käyttöön
ohjelma on tarkoitettu.

Selaa huvikseen pari man-sivua, esim. käyttöohjeet edellä kokeilluista
komennoista:: 

    man pwd

    man less

Viimeksi mainittu, eli ``less`` -ohjelman manuaalisivu,
kertoo mm. suhteesta POSIX-yhteensopivaan ``more`` -ohjelmaan.

Vielä enemmän tietoa Jalavaan asennetuista ohjelmista tarjoaa GNU
-ohjelmistoissa yleisesti käytetty ``info``-järjestelmä. Kokeile::

    info info

Info opastaa nyt infon käyttämistä. Info on itse asiassa
interaktiivinen, tekstimuotoinen hypertekstijärjestelmä, jonka
sisältöihin voi vaikka tutustua myöhemmin omalla ajalla. Info-lukijan
oma intro saadaan päälle painamalla ``Shift-H`` (siis iso H;
info-ohjelmassa pieni h tekee jotakin muuta). Ja tästähän se opas
alkaisi::

    1.2 How to use Info
    ===================

    You are talking to the program Info, for reading documentation.

Monet tekstimuotoiset sovellukset ovat varsin hyvin dokumentoituja ja
käyttäjäystävällisiä -- se ystävällisyys pitää vain hahmottaa "kovan
pinnan" alta, joka ainakin aluksi saattaa syntyä siitä
tekstimuotoisuudesta ...

Melkein kaikesta on joko man-sivu tai info-dokumentaatio. Lisäksi
hyvän komentoriviohjelman tunnistaa siitä, että sitä voi komentaa
argumentilla ``--help`` näin::

    ls --help

Silloin ohjelma itse tulostaa pienen perusavustuksen. 

Komennetaan vielä vaaroihin tottuaksemme tiedoston poistokomennolle
seuraavasti::

    rm --help

Ole tarkkana, ettet vahingossa anna tälle komennolle minkään sellaisen
tiedoston nimeä, jota et halua hukata. Ylläolevassa
esimerkkikomennossa ei ole tiedoston nimeä vaan ainoastaan valitsin, jolla
pyydetään ohjetta. Huomaa muuten, että tiedoston poistamisväline
``rm`` ilmoittaa avustuksessa: "*Note that if you use rm to remove a
file, it might be possible to recover some of its contents, given
sufficient expertise and/or time*" (sanamuoto oli tämä ainakin
2024-03-21). Tämä tarkoittaa, että jos vieraan valtion agentti
varastaa kovalevyn riittävän pian tiedoston poiston jälkeen, niin
tietyin keinoin on mahdollista palauttaa ainakin osia
tiedostosta. Tietoturvamielessä kannattaisi kirjoittaa ensin
arkaluontoisen datan päälle jotain merkityksetöntä tauhkaa, jotta
magneettipinta unohtaa historiansa. Tämän tekisi tiedoston
silpomisväline ``shred``. Arvatenkin silppurin manuaali kertoo lisää
yksityiskohtia. Tietoturva ja sähköinen todistusaineisto eivät ole
tämän kurssin ydinsisältöä, joten palataanpa perusasiaan.

Kiteytetään vielä kerran:

  - Tiettyyn Unix-koneeseen asennetut, kaikkien käyttäjien
    suoritettavissa olevat, ohjelmat voidaan listata jotakuinkin
    näillä komennoilla::

       ls /bin/
       ls /usr/bin/
       ls /usr/local/bin

  - Järjestelmän ylläpitoon liittyvät ohjelmat, joista useimpia vain
    ylläpitäjät voivat ajaa, voidaan listata näin::

       ls /sbin/

  - Jokaisesta ohjelmasta saa yleensä tietoja paikan päällä
    komentamalla jompikumpi::

       man ohjelmannimi
       ohjelmannimi --help     # tai -h tai -? ...

  - Tällä kurssilaa tulee jonkin verran tutuksi standardi nimeltä
    POSIX, joka määrittelee joitain kymmeniä ohjelmia, jotka
    yhteensopivasta järjestelmästä aina löytyy. Se myös määrittää
    kyseisille ohjelmille joitakin argumentteja, joita niille voi
    kaikissa yhteensopivissa toteutuksissa antaa.

  - (Lisäksi tietenkin Internetistä ja painetuista manuaaleista löytyy
    ohjeita ja tutoriaaleja pilvin pimein)




Osa 4: Tiedostonhallintaa
=========================

Käydään juuressa
----------------

.. pwd
   cd ..

   ls
   pwd

   Mitä tapahtui? Siirryit hakemistopuussa yhtä askelta
   ylöspäin. Äsken olit Unix-kotihakemistossasi (joka siis Windowsissa
   näkyy U: -asemana). Nyt oletkin siinä hakemistossa, joka sisältää
   kotihakemistosi. Shell pitää kirjaa työhakemistosta ja ``pwd``
   näyttää, mikä se tällä hetkellä on.

   HUOM: Joo ei tehdä tätä nyt 2014 - näyttää (ehkä) jumittuvan aika
   pahasti, ja voipi olla ongelma kaikille käyttäjille(?). Liekö
   liittyväinen aiemmin havaittuun login-viiveeseen...

Komenna::

    cd /

Mikäs nyt on työhakemisto? Muistat edellisestä, että sen voi aina
selvittää komennolla ``pwd``. Komenna::

    ls

Näyttääkö jotakuinkin tältä::

    adminhome    boot         ...
    autohome     ...
    automisc     
    ...

Kyseessä on Linux-koneen **juurihakemisto** (engl. *root directory*),
jonka alla kaikki on. POSIX määrittelee, että juuren nimi on ``/`` ja
että sen alta löytyy hakemistot ``/dev/`` ja ``/tmp/``.

Muillakin hakemistoilla on useimmissa unix/linux -asennuksissa samat
nimet kuin meidän asennuksessamme, ja niillä kullakin on
erityismerkitys. Hakemistot ``/bin`` ja ``/usr/bin`` tulivat tutuiksi
aiemmin; niissä on käynnistyskelpoisia ohjelmia. ``/sbin`` sisältää
järjestelmänhallintaan liittyviä ohjelmia, joita pääkäyttäjä eli
"root" voi hyödyntää interaktiivisesti sekä ylläpitoskriptien
osana. ``/lib`` ja ``/usr/lib`` sisältävät aliohjelmakirjastoja, joita
voidaan linkittää ohjelmiin. ``/lib64`` ja ``/usr/lib64`` sisältävät
kirjastojen aidosti 64-bittiset versiot. Sattuneista syistä nykyisissä
64-bittisissä koneissa joudutaan ajamaan vielä myös 32-bittisiä
ohjelmia ja kirjastoja, mistä syystä hakemistot on täten eriytetty
toisistaan (tilanne tarkistettu viimeksi vuonna 2024 tätä demoa varten).

Hakemisto ``/home`` on yleensä se, missä kotihakemistot eli käyttäjien
omat tiedostot sijaitsevat. Yliopistolla on kuitenkin niin paljon
porukkaa, että levyjärjestelmä on ylipäätään aika massivinen ja sen
lisäksi kotipäähakemistoja on monta, eli vuonna 2020 näyttää olevan ``nashome1``,
``nashome2``, ...,  ``nashome9``. **Älä ota listausta** noiden
verkkolevyjen koko sisällöstä juuri nyt.  Verkkolevyn 16000+ käyttäjän
hakemistojen läpikäynti näyttää (ainakin v. 2015-2016) jumittuvan aika
pahasti, mikäli on kulunut pitkä aika edellisestä listauksesta.
*Jätetään toistaiseksi mieluusti listailematta* nämä ``nashome``:t,
vaikka se mukavaa olisikin. (... voi olla, että ongelma on korjattu
2017, mutta vanhalta muistilta tulee oltua hiukan varovainen. Aiempina
vuosina netissä näyttäisi olleen vastaavasta ongelmasta
bugiraportteja, viitaten tilanteeseen, että uudet käyttäjät eivät
pääse kirjautumaan ilman merkittävää viivettä silloin, kun toinen
ohjelma käy läpi käyttäjätietoja. *Listaillaan me nyt siis vaan
kohteita, joissa ei tarvitse selata tuhansia käyttäjiä*. Ainakin
kaikki oman kotihakemiston alla tehdyt listaukset ovat täysin
haitattomia muille.)

Hakemistossa ``/boot`` on käyttöjärjestelmäytimen käännetty
konekielikoodi, joka käynnistyksen (engl. *boot*) yhteydessä
ladataan. ``/var`` sisältää mm. lokitietoja järjestelmän toiminnasta
("var"=="variable content"). ``/etc`` sisältää eri ohjelmien asetuksia
("etc"=="et cetera"). ``/tmp`` sisältää ohjelmien väliaikaisia
tiedostoja ("tmp"=="temporary"). Eksoottisempia hakemistoja ovat
``/proc`` ja ``/dev``. Ensiksi mainitussa on ajonaikaisten ohjelmien
(eli *prosessien*, engl. *process*; tämä termi tulee vahvaan rooliin
kurssin edetessä) tietoja ja jälkimmäisen kautta pääsee käsiksi
laitteisiin (engl. *device*). Unixissa (ja sen "perillisessä"
Linuxissa) tiedostojärjestelmän kautta hallitaan muutakin kuin
tiedostoja! Tai siis kaikki asiat näyttäytyvät tiedostoina
tiedostojärjestelmän ja hakemistorakenteen kautta. Jos lyhyiden nimien
taustat kiinnostavat enemmän, esimerkiksi StackExchangen Server
Faultissa on asiaa kysytty ja vastattukin aika uskottavalla tavoin:
https://serverfault.com/questions/24523/meaning-of-directories-on-unix-and-unix-like-systems
(linkin toimivuus tarkistettu viimeksi 21.3.2024)

Unixin hakemistorakenne juuresta alkaen on tässä mielessä looginen ja
selkeä. Fyysisten kovalevyjen eri tiedostojärjestelmät, verkkolevyt ja
jopa ohjelmat ja laitteetkin löytyvät nätisti omilta paikoiltaan - 
kaikki saman juurihakemiston ``/`` alta.

Löydätkö kotiin? Eli muistatko ulkoa kotihakemistosi nimen, jos nyt
pitäisi mennä esim. niinku meikäläinen::

    cd nashome3
    cd nieminen

Ei hätää, jos et muista. Komenna::

    cd

Kokeile esim. ``pwd``-ohjelmalla, että olet taas
kotihakemistossasi. ``cd`` -komento ilman argumentteja siirtää
kotihakemistoon.

Itse asiassa ``cd`` ilman parametreja on sama kuin komento::

    cd $HOME

missä ``$HOME`` on ns. ympäristömuuttuja (engl. *environment
variable*). Mutta ympäristömuuttujista tulee lisää asiaa varmaan
jossain myöhemmässä vaiheessa kurssia.


Tehdään hakemistoja
-------------------

Tehdään verkkolevyllesi hakemisto Käyttöjärjestelmät-kurssin
ensimmäistä demoa varten. Saat valita minkä tahansa hakemistonimen;
esimerkissä on ``kj24`` koska mun mielestä se on ihan kiva nimi
hakemistolle, jossa on käyttöjärjestelmäkurssin asioita vuoden 2024
keväällä. Ääkkösiä ja erikoismerkkejä kannattanee vielä tänäkin
päivänä välttää tiedostonimissä, koska niiden koodauksen standardit
ovat laahanneet hiukan perässä järjestelmien välillä, ja maailmalla on
käytössä laitteita, joiden tiedostojärjestelmät ovat peräisin
vuosikymmenten takaa. Välilyöntejä saa periaatteessa olla, mutta
niiden kanssa on oltava tarkkana, koska tosiaan mm. kuorikomennoissa
välilyönti ilman erityismerkkausta tulkitaan erotinmerkiksi
argumenttien välillä!

Komenna::

    mkdir kj24

Sitten mene juuri luotuun hakemistoon::

    cd kj24

Jos haluat varmistua hakemiston vaihtumisesta, voit käyttää taas
``pwd`` -komentoa... 

Komenna seuraavasti::

    mkdir demo{1,2,3,4}

Tarkista tulema komentamalla::

    ls

Mitä tapahtui? Interaktiivisissa kuorissa on tiettyjä
tehokäyttöominaisuuksia. Yksi esimerkki on tämä ``bash``-kuoren
ominaisuus, jossa komentoriville kirjoitettu teksti
``jotakin{muuta,puuta,juu}`` korvautuu ennen komennon suorittamista
yhdistelmällä ``jotakinmuuta jotakinpuuta jotakinjuu``.  Kun tästä
tulee refleksi, muuttuu aika monen asian tekeminen
nopeammaksi. (Huom: mm. tämä on esimerkissä käytetyn bash-kuoren
teho-ominaisuus, jota POSIX ei välttämättä määrittele - tarkista itse
jossakin vaiheessa; kyky lukea mm. POSIXin tekstiä on kurssin
osaamistavoite...)

Kokeile::

    echo {aa,bee}{1,2,3}{X,Y}

Jännää, eikö. Jätetään asia "hautumaan" ja siirrytään seuraavaan.



Osa 5: Temppuja
===============

Eri kuoret toimivat monella tapaa erilaisesti, mutta jotkut asiat
ovat yhteisiä monille niistä. Ainakin seuraavien ominaisuuksien
pitäisi toimia ainakin sekä ``bash`` että ``tcsh`` -kuorissa. Moni
asia on myös esim. POSIX-standardin määrittelemää, joten vastaavaa on
käytettävissä kaikissa järkevissä
kuorissa. Kuitenkin mm. näppäinyhdistelmät voivat olla ihan
erilaisia. (TODO: Jos joku haluaa selata, mitä, jos mitään, POSIX
sanoo interaktiivisesta komentorivistä ja mahdollisesti
näppäinyhdistelmistä, sen saa ilman muuta tehdä; itselläni ei ole
vielä ollut aikaa; tässä kerrotut asiat toimivat kokeillusti
yliopistomme suorakäyttökoneille asennetussa bashissa.)

Interaktiivisuuden tehostamista
-------------------------------

Pitkien rimpsujen kirjoittaminen on hidasta (verrattuna
esim. klikkaamiseen hiirellä), mutta näppäimistön käyttö sinänsä on
nopeata, jos näppäinpainallusten määrää saadaan rajoitettua.

Kokeilepa seuraavaa:

   - Paina nuolta ylöspäin ja katso mitä tapahtui! (Saat edellisen
     komennon, jonka voit antaa uudelleen ihan vaan painamalla
     enteriä). Komennon toistaminen vaatii siis vain kaksi
     näppäinpainallusta.

   - Painelepa nuolta ylöspäin useampia kertoja. Saat aina edellisen
     ja edellisen komennon. 

   - Nuoli alaspäin selaa tietysti toiseen suuntaan.

Tämän nimi on *komentohistoria* ja se on kätevä juttu. Jos haluat
uudelleen komennon, jonka teit pari askelta sitten, se löytyy
muutamalla painalluksella.  Sitten katsotaan rivin editointia:

   - Selaa historiasta tuo äskeinen komento::

          echo {aa,bee}{1,2,3}{X,Y}

     Nuolilla vasemmalle ja oikealle voit siirtää kursoria
     komentorivillä vanhan komennon päälle. Muuta se seuraavanlaiseksi
     siten, että vaihdat ainoastaan ``X``-kirjaimen
     ``Z``-kirjaimeksi::

          echo {aa,bee}{1,2,3}{Z,Y}

     Suorita.

     Suorita vielä komentohistoriaa käyttämällä nämä vähän eri
     komennot::

          echo {aa,bee}{1,2,3}{W,Y}

          echo {aa,bee}{1,2,3}{kuu,Y}

          echo {aa,bee}{1..15}{kuu,Y}

   - Katsotaanpa lisää näppäinpainallusten välttämistä. Ota
     historiasta vielä tuo edellinen, melko pitkä, komentorivi
     editoitavaksi. Kokeile näppäimiä ``Ctrl-a`` ja ``Ctrl-e``. Rivin
     alkuun ja loppuun hyppiminen on nopeaa!

..   - Jos pääteyhteysohjelmasi välittää Alt-näppäimen oikein (mikä ei
     kaikilla pääteyhteysohjelmilla ole varmaa...), voit hyppiä
     kokonainen sana kerrallaan painamalla Altia ja nuolinäppäimiä
     vasemmalle ja oikealle.

   - Luovutaan käsien siirtämisestä nuolinäppäimille: Voit mennä
     rivillä eteenpäin painamalla ``Ctrl-f`` ("f" niinkuin "forward")
     ja taaksepäin painamalla ``Ctrl-b`` ("b" niinkuin
     "backward"). Edelliseen komentohistorian komentoon pääsee
     ``Ctrl-p`` ("p" niinkuin "previous") ja seuraavaan ``Ctrl-n``
     ("n" niinkuin "next"). Ei jaksa siirtää käsiä nuolinäppäimille
     enää?

   - Ja vielä lisää. Tyhjennä komentorivi menemällä sen alkuun
     (``Ctrl-a``) ja sitten tyhjentämällä loppuosa rivistä
     (``Ctrl-k``). Laitakin se takaisin (``Ctrl-y``)...

Komentorivin editointi on tehty nykyisissä kuorissa monella tapaa
tehokkaaksi. Tässä vielä yksi tapa:

   - Kirjoita tyhjän rivin alkuun ``less /u`` ja paina sen jälkeen
     tabulaattoria eli sarkainnäppäintä. Huomannet, että kuori osaa
     tutkia hakemistorakennetta ja täydentää sinne hakemiston tai
     tiedoston nimen aina siihen asti kuin se on
     yksikäsitteinen. Tässä tapauksessa komentorivilläsi pitäisi olla
     edellisten kahdeksan näppäilyn jälkeen teksti ``less /usr/``
     Jatka kirjoittamalla perään ``i`` eli ``less /usr/i`` ja paina
     taas tabulaattoria.  Nyt rivillä on ``less /usr/include/``.
     Näppäile ``mat`` ja vielä kerran tabulaattori.  Rivillä on nyt
     komento::

          less /usr/include/math.h

     Kun tästä tulee refleksi, on tiedostojen löytäminen erittäin
     syvistäkin hakemistorakenteista helppoa ja nopeaa interaktiivisen
     kuoren avulla.

     Ainakin bashissa myös yhdistelmä ``Ctrl-i`` toimii kuten
     tabulaattori, ja se saattaa olla pienemmän sormiliikkeen takana
     kuin tabulaattori.

Voit myös suorittaa tuon viimeisimmän komennon, jos haluat:
Less-ohjelmallahan voi selata tekstitiedostoja nuolinäppäimillä
interaktiivisesti. Ja näppäin ``q`` lopettaa sen.

Edellä paikannetussa tiedostossa on C-kielen matematiikkakirjaston
rajapintaa, mm. Piin likiarvon ja muiden vakioiden määrittelyjä; miten
tämä taas liittyy tähän kurssiin mitenkään? Esimerkiksi siten, että
käyttöjärjestelmästandardi POSIX sisältää osia C-kielen standardista,
mukaanlukien ``math.h``:n välttämättömän sisällön yhteensopivissa
järjestelmissä. Eli käyttöjärjestelmästandardi voi ottaa välillisesti
kantaa myös ympyrän kehän suhteeseen sen halkaisijaan (tai ainakin nyt
nimeen, jolla tuollaiseen suhdelukuun voi viitata yhteensopivassa
ohjelmakoodissa).



Useamman ohjelman käyttöä, putkittaminen
----------------------------------------

Kokeile seuraavia perusesimerkkejä Unixin ideologiasta "paljon pieniä
ohjelmia, jotka tekevät yhden asian hyvin ja joita voi yhdistellä
monimutkaisempien ongelmien ratkaisemiseksi". Niissä käytetään aiemmin
``less``-ohjelman yhteydessä nähtyä putkittamista. Aloitetaan vaikkapa
komentamalla::

   who | sort

Who-ohjelman tuloste menee sortille, joka lajittelee rivit
aakkosjärjestykseen. Kokeile sitten seuraavaa::

   who | cut -c-8 | sort | uniq

Who-ohjelman tuloste menee tässä cutille, joka leikkaa kahdeksannen
merkin kohdalta aina rivin poikki; sitten leikatut rivit menevät
cutilta sortille ja lopulta ohjelmalle ``uniq`` joka jättää
peräkkäisistä samoista riveistä vain yhden jäljelle. Lopputuloksena on
aakkosjärjestyksessä kaikki käyttäjät vain yhteen kertaan listattuna,
vaikka heillä olisi useita rinnakkaisia pääteistuntoja auki. Vielä
yksi::

   who | cut -c-8 | sort | uniq | wc -l

Tässä vielä ``uniq``-ohjelman tulos putkitetaan ``wc``:lle, joka
laskee rivien määrän (viimeinen merkki komennossa on ällä eikä
ykkönen!). Lopputuloksena on kuorikomentojen ketju, joka laskee
konetta tällä hetkellä käyttävien henkilöiden määrän.

Huomautus 1: Pitkät putkitukset ohjelmalta toiselle ovat tuhlailevaisia,
koska jokainen ohjelma on käynnissä yhtäaikaa. Jokainen niistä vaatii
käyttöjärjestelmän resursseja, joiden rajallisuuteen tällä kurssilla
tutustutaan piakkoin. Putkia on kuitenkin periaatteessa mahdollista
tehdä, ja yllä olevat olivat ensimmäisiä oppikirjaesimerkkejä siitä, miten ne toimivat. Ne
ovat käteviä, mutta ylenmääräistä putkittamista on hyvä pyrkiä
välttämään oikeissa kuoriskripteissä.

Huomautus 2: Putki on synkronoitu tuottaja-kuluttaja -toteutus, jonka
Unix-järjestelmä tarjoaa palveluna. Tähänkin syvennytään kurssilla
myöhemmin. Ohjelmat näkevät niille putkesta tulevat tavut standardina
syöttövirtana ja laittavat ulosmenevään putkeen tarkoitetut tavut
standardiin tulostusvirtaan. Mistä putki tulee sisään tai mihin se vie
ulostulosta, on määrättävissä ulkopuolelta, esimerkiksi kuoren
komentoriviltä.



Tulosteiden ohjaus tiedostoon
-----------------------------

Putkien käytön lisäksi on hyötyä tietää, miten kuorikomennoissa
pääsee käsiksi tiedostoihin. Varmistu ensin, että olet äsken
tekemässäsi ``demo1`` -hakemistossa, jos olet tehnyt välillä
kokeiluja. Toisin sanoen komenna ``pwd`` ja varmista että tuloste
näyttää jotakuinkin tältä (tietysti oman kotihakemistosi alla)::

  /nashome3/nieminen/kj24/demo1

Kokeile ensin grep-ohjelman toimintaa (tuon hirmuisen pitkän
tiedostonimen ``config...`` kirjoittamisessa voi kokeilla
tabulaattorin käyttöä, kirjoittamalla siitä vain alku, vaikkapa
``con`` ja painamalla tabulaattoria. Täydennys tapahtuu ensin vain
siihen asti, kun on yksikäsitteistä. Painamalla tabia kaksi kertaa
lisää, tulostuu vaihtoehdot, joista on kirjoitettava taas pari merkkiä
lisää, esim. ``15`` ja sitten uudelleen. Tätä toistamalla päädyt
yksikäsitteiseen täydennettyyn nimeen, jossa ei pysty olemaan
kirjoitusvirheitä, koska se on automaattisesti haettu)::

  grep TIME /boot/config-2.6.32-642.15.1.el6.x86_64

Lisäksi tämä esimerkki on vuosia vanha, joten tarkoitetun tiedoston
nimi tänään on varmasti erilainen. Täydentele siis tabulaattorilla
loppuun saakka jokin nimi, joka juuri tänä päivänä alkaa
``/boot/config-``

Näin komennettu ``grep`` etsi toisena argumenttina annetusta
linux-ytimen konfigurointitiedostosta kaikki rivit, joilla esiintyy
ensimmäisenä argumenttina annettu merkkijono "TIME". Grep on todella
hyödyllinen väline isojen tekstimassojen selaamiseen. Kyseinen
tiedosto, jota nyt tarkastellaan, sisältää tuhansia rivejä
määritelmiä, jotka vaikuttavat syvällisesti siihen, kuinka tämä
nimenomainen käyttöjärjestelmäyksilö toimii erilaisissa olosuhteissa
ja käyttötarkoituksissa. Pienellä kurssilla ehditään raapaista jonkin
verran pintaa osa-alueista, joiden nippelit juuri tuossa tiedostossa
on aseteltu. Palataan kuitenkin ainakin toistaiseksi konepellin alla
olevista nippeleistä kuoren päälle.

Komenna (tietenkin komentohistoriasta nuolinäppäimellä tai
``Ctrl-p``:llä hakien ja äskeistä komentoriviä muokaten)::

  grep TIME /boot/config-2.6.32-642.15.1.el6.x86_64 > timet.txt

Mitään ei tulostunut näytölle. Syy on se, että väkäsellä ``>`` pyysit
ohjaamaan ``grep`` -ohjelman tulosteen tiedostoon, jonka nimi on
``timet.txt``. VARO VAARAA taas: Väkäsellä ohjattaessa kohdetiedoston
mahdollinen aiempi sisältö tuhoutuu ja se korvataan uudella. Tämän
ohjeen turvallisuus perustuu siihen, että olet ohjeen mukaisesti tätä
demoa varten luodussa tyhjässä hakemistossa, jossa ei vielä ollut
olemassa tiedostoa nimeltä ``timet.txt``. Totea että tiedosto
``timet.txt`` on nyt syntynyt. Komenna::

  ls -l

Näet mm. jokaisen tiedoston viimeisen muutosajankohdan ja pituuden
tavuina, koska ``ls`` hyväksyy valitsimen ``-l`` eli ällä niinkuin
"long format". Totea tiedoston sisältö::

  cat timet.txt

Ohjelma ``cat`` tosiaan tulostaa argumenttina annetun
tiedoston. Putkia voi yhdistää ja lopputuloksen voi sijoittaa
tiedostoon. Kokeile ja havainnoi::

  cat timet.txt | grep HPET > hpetit.txt

  cat hpetit.txt

  grep TIME /boot/config-2.6.32-642.15.1.el6.x86_64 | grep SND > soundit.txt

  cat soundit.txt

Huomaa, että ``grep`` -ohjelma osaa toimia joko
standardisyöttövirrasta tai lukemalla argumenttina annetun tiedoston.

Väkäsellä ohjaus siis korvaa tiedoston aiemman sisällön. Tiedoston
peräänkin voidaan kyllä jatkaa; silloin pitää käyttää kahta väkästä
peräkkäin ``>>`` eli kokeile vaikkapa seuraavaa ja havainnoi
tulokset::

  echo "Pari tiedostoa nipussa:"  >  nippu.txt

  echo "-------------"  >>  nippu.txt

  cat hpetit.txt >> nippu.txt

  echo "-------------"  >>  nippu.txt

  cat soundit.txt >> nippu.txt

Miten tulokset siis todetaan? Tiedät jo, eikä seuraavaa vinkkiä
tarvittaisi::

  cat nippu.txt

Enää et myöskään tarvitsisi vinkkiä, että pidempi tiedosto kannattaa
mahdollisesti selata sivuttajaohjelmalla, esim::

  less nippu.txt

Alat jo osata ja muistaa? Hyvä - sitä tavoitellaan! Ehkäpä on kertynyt
muistiinpanojakin, koska muisti itsessään on hatara...

Huomionarvoinen seikka erityisesti komentorivityöskentelyyn
tottumattomille on vaikka edellisten esimerkkien pohjalta tajuta,
milloin käytetään komentoa ``echo`` edelleenohjauksen yhteydessä ja
milloin sitä ei tarvita. Edelleenohjaus onnistuu ilman komentoa ``echo``
aivan mainiosti, mutta sitä tarvitaan jos halutaan lisätä jotain omaa
tekstiä edelleenohjaukseen lisäksi.

Voi googlettaa "useless use of echo".

Syötteiden lukeminen tiedostosta
--------------------------------

Tiedostosta voidaan myös lukea syöte ohjelman standardisyöttövirtaan;
silloin käytetään väkästä toisin päin eli ``<``. Kokeile::

  less < nippu.txt

  wc -l < nippu.txt

Luettu syöte voi aloittaa putkiketjun::

  sort < nippu.txt | uniq | wc -l

Silloin se kirjoitetaan ensimmäisen ohjelman perään, ja ensimmäinen
putkimerkki on tämän kokonaisuuden jälkeen.



Vielä pari kuorikikkaa
-----------------------

Komenna::

    echo Oletko `whoami` vai kuka

Eli kuori suorittaa "backtick" -merkkien välissä olevan tekstin
*komentona* ensin ja sijoittaa sen antaman tulosteen komentoriviin,
joka sitten suoritetaan. Tämä on usein hyödyllinen kikka skripteissä -
toimii tietysti lähinnä ohjelmille, jotka tulostavat vain
vähän. Komento ``echo`` olikin varmaan jo aiemmasta kohdasta
tuttu. Jos sattui unohtumaan, niinkuin normaalia on, komento ``man
echo`` tietysti muistuttaa asiasta.

Huomaa, että "backtickien" välissä voi olla täydellinen kuorikomento,
jossa voi siis olla vaikkapa putkitus::

    echo Paikalla on `who | cut -c-8 | sort | uniq | wc -l` kayttajaa

Näitä voi olla komennossa monta, kuten seuraavassa esimerkissä. Se ei
mahdu yhdelle riville paperitulostetta, joten siinä käytetään
tyypillistä rivinjatkomenettelyä kenoviivalla: voit näppäillä enterin
välittömästi kenoviivan ``\`` jälkeen kertoaksesi kuorelle, että aiot
jatkaa vielä komentoa seuraavalle riville, tai sitten voit jättää
kenoviivat pois ja laittaa koko komennon samalle riville. Mieluiten
tietysti otat komentohistoriasta edellisen rivin ja muokkaat siitä
vain alkupuolen uusiksi::

    echo `whoami` laski `date` etta paikalla on \
      `who | cut -c-8 | sort | uniq | wc -l` kayttajaa

Ja niin edelleen. Tällaisia tietovirtojen ohjauksia voi tehdä
kuorissa. Näitä sovelletaan jatkossa, joten tätä kannattaa
jumpata. Muista tärkein perusohje: varmista etukäteen, että tiedät,
mitä kokeilusi tulee aiheuttamaan, ettei vahingossa tuhoudu mitään.


Mistä saat täydellisen opastuksen käyttämääsi kuoreen
------------------------------------------------------

Jos et vielä arvannut, niin paljastan suuren salaisuuden::

    man bash

    man tcsh

Ja niin edelleen (``ksh``, ``zsh``). Kuorien manuaalit ovat pitkiä
(koska ohjelmissa on paljon ominaisuuksia selitettävänä) ja aluksi
ehkä hiukan vaikealukuisia (koska ne on tehty hyödyttämään
tehokäyttäjää tehokkaalla tavalla). Ne kertovat kaikki kikat, joita
kullakin kuorella voi käyttää, sekä myös kyseisen kuoren
skriptiohjelmoinnin mahdollisuudet.

POSIX-yhteensopivassa kuoressa on
oltava standardin määrittelemät ominaisuudet, mutta useimmissa on
runsaasti laajennoksia. Tällä kurssilla käytämme jatkossa yksinomaan
bashia, mutta pidetään POSIX tyynyn alla ja yritetään hahmottaa
jotakin myös standardin määräämän osajoukon laajuudesta.

Kuorista on myös määrättömän paljon hyviä johdantoja
Internetissä. Niistä osa on kirjoitettu myös vasta-alkajille -- eli ei
muuta kuin hakukone käyttöön, jos asia alkaa kiinnostaa enemmän!


Osa 6: Pakollinen palautustehtävä
=================================

**HUOM:** Keväällä 2024 joillain saattaa automaattisesti olla
oletuksena kuori ``tcsh`` eikä ``bash``. Voit huomata tilanteen
komennon ``ps -f`` tulosteesta. Jos haluat olla jo tässä vaiheessa
viimeisen päälle yhteensopiva, voit pyytää tcsh-kuorta muuntautumaan
bash-kirjautumiskuoreksi antamalla seuraavan komennon: ``exec bash -l``
jossa viimeinen välilyönnillä erotettu osa on miinusmerkki ja
pieni äl-kirjain.  Kirjasimesta riippuen pieni äl voi olla hyvin saman
näköinen kuin ykkönen, iso ii-kirjain tai tolppamerkki. (Myöhemmin
selviää, mitä tarkoittaa, että POSIX-käyttöjärjestelmätoiminto "exec"
pyytää käyttöjärjestelmää korvaamaan nykyisen prosessin uudella, joka
vastaa exec-toiminnossa mainitun komennon suorittamista mahdollisine
argumentteineen)




**HUOM:** Keväällä 2024 kurssin demojen palautus tehdään
Moodleen. Kunkin palautuslaatikon avautumisesta ilmoitetaan Moodlen
Uutiset-tiedotuskanavalla sitten, kun olemme ehtineet testata
palautuksen, osasuoritusmerkintöjen ja palautteenannon
yksityiskohdat. Siihen asti osannet pitää vastaustiedostosi tallessa
verkkolevylläsi siinä hakemistorakenteen alipuussa, joka tässä demossa
tehtiin. On myös mahdollista, että teemme (jonakin vuonna)
esitarkistimen, jolla voit jo ennen palautusta kokeilla, että vastaus
on todennäköisesti oikean muotoinen. Tästäkin informoidaan, jos
sellainen joskus tulee. Vielä keväällä 2024 ole itse
huolellinen. Voit tutkia tiedostoa ennen palautusta jo opituilla
tavoilla eli komennoilla ``cat`` ja ``less`` ja ``hexdump``.


Kotoa käsin palautettaessa tiedosto on saatava yliopiston
verkkolevyltä ensin omalle koneelle. Ohjeita kotipalauttajille
erillisellä sivulla:
http://users.jyu.fi/~nieminen/kj24/demovedokset/tekniset_ohjeet_kotipalautus.html

Tästä demosta palautetaan tasan yksi tiedosto nimeltään "vastaus.txt",
joka on luotu täsmälleen seuraavalla tavoin:

1. Tee aiemmin luotuun demohakemistoosi ``demo1`` tiedosto nimeltä
   ``vastaus.txt``, jossa on sisältönä ``whoami`` -ohjelmalla
   tulostamasi käyttäjänimi. Sovella tietysti aiemmin nähtyä
   tiedostoon ohjaamismenettelyä - älä edes yritä kirjoittaa tiedostoa
   tekstieditorilla ja copy-paste -menettelyillä, koska siitä tulee
   silloin todennäköisesti erilainen (mm. unix-rivinvaihto on eri kuin
   Windowsissa, editori saattaa laittaa alkuun tiettyjä Unicodeen
   liittyviä erikoismerkkejä, ja editorilla tulee myös liian helposti
   ylimääräisiä välilyöntejä tai muuta asiaan kuulumatonta)! Tässä
   harjoitellaan nyt interaktiivisen kuoren hallittua käyttöä, joten
   kaikki osavaiheet tehdään sillä.

.. Palautusjärjestelmän ominaisuuksien vuoksi tämän tehtävän
   sisältöä käytettäneen myös tunnistamaan vastaajan identiteetti,
   joten jos "huijaat" jotenkin, niin huijaa sitten edes siten, että
   ensimmäinen rivi tiedoston alusta unix-rivinvaihtoon asti sisältää
   oikeasti tasan tarkkaan yliopiston käyttäjätunnuksesi eikä mitään
   muuta :)

2. Jatka tiedostoa niin, että seuraavalle riville tulee komennon
   ``date`` tuloste.

3. Jatka tiedostoa edelleen komennon ``uname -a`` tulosteella

4. Jatka tiedostoa edelleen komennon ``ps -f`` tulosteella

5. Laita loppuun vielä komennon ``pwd`` tuloste.

6. Tarkista, että tiedoston sisältö näyttää pääpiirteissään seuraavan
   esimerkin kaltaiselta (ajankohdat, tunnukset ja numerot tietysti
   ovat yksilölliset, yksityiskohdat ovat voineet muuttua vuoden 2024
   ja sen sellaista)::

     nieminen
     Wed  6 Nov 11:40:51 EET 2024
     Linux halava.cc.jyu.fi 5.14.0-427.37.1.el9_4.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Sep 13 12:41:50 EDT 2024 x86_64 x86_64 x86_64 GNU/Linux
     UID          PID    PPID  C STIME TTY          TIME CMD
     nieminen 3061589  783478  0 11:21 pts/66   00:00:00 /bin/bash
     nieminen 3062660 3061589  0 11:41 pts/66   00:00:00 ps -f
     /nashome3/nieminen/kj24esim/demo1

7. Kannattaa tarkistaa myös komennolla ``hexdump -C vastaus.txt | head``
   ettei tiedoston alussa faktisesti ole muuta kuin käyttäjätunnus ja
   unix-rivinvaihto (heksana merkki ``0a``), esim.::

     00000000  6e 69 65 6d 69 6e 65 6e  0a 57 65 64 20 20 36 20  |nieminen.Wed  6 |
     00000010  4e 6f 76 20 31 31 3a 34  30 3a 35 31 20 45 45 54  |Nov 11:40:51 EET|
     00000020  20 32 30 32 34 0a 4c 69  6e 75 78 20 68 61 6c 61  | 2024.Linux hala|
     00000030  76 61 2e 63 63 2e 6a 79  75 2e 66 69 20 35 2e 31  |va.cc.jyu.fi 5.1|
     ...


8. Palauta syntynyt tiedosto Moodleen, kunhan palautuslaatikon
   aukeamisesta on ilmoitettu.