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ä.
Tämän luennon jälkeen sinun pitäisi osata:
- avata SSH-yhteys yliopiston Linux-palvelimelle ja kirjautua ulos siististi;
- liikkua hakemistopuussa ja käyttää sekä suhteellisia että absoluuttisia viittauksia;
- luoda, kopioida, siirtää ja poistaa tiedostoja ja hakemistoja turvallisesti;
- lukea
ls -l-listauksen oikeudet ja korjata www-hakemistonsa oikeudet niin, että sivut näkyvät selaimessa; - selittää, mitä komentotulkki tekee kirjoittamallesi riville ennen kuin ohjelma käynnistyy, ja soveltaa tätä jokerimerkkeihin ja lainausmerkkeihin;
- ohjata ohjelman tulosteen tiedostoon tai toiselle ohjelmalle ja erottaa vakiotuloste virhevirrasta;
- tunnistaa, että jako suhteellisiin ja absoluuttisiin viittauksiin koskee myös www-sivujen osoitteita;
- tulkita tavallisimmat virheilmoitukset ja selvitä jumitilanteista;
- kirjoittaa yksinkertaisen komentojonon eli skriptin.
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:
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:
- W:-aseman eli paikan omille kotisivuille.
- Mahdollisuuden
käyttää verkkolevyasemiasi (U:- ja W:-asema) kotikoneelta.
- VPN-yhteys tarvitaan aina, kun kone ei ole yliopiston verkossa.
- Tiedostojen siirtäminen WinSCP-ohjelmalla.
Mac-koneilla voit WinSCP:n sijaan käyttää
FileZillaa, joka toimii hyvin samalla tavalla.
Molemmat voi korvata komentorivin
scp- tairsync-komennolla, joihin tutustutaan luvussa 34.
- Unix- ja WWW-palveluiden aktivoinnin sso.jyu.fi-palvelussa (Kirjaudu → Oma → Palvelut → valitse Kotisivutila ja Unix-suorakäyttöpalvelimien kirjautumisoikeus). Unix-palveluilla tarkoitetaan käyttöoikeuksia halava- ja jalava-koneisiin. Aktivointi voi kestää 30–60 minuuttia.
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)?
- Komentorivi on eräs mahdollisuus käyttöjärjestelmien ja muiden ohjelmien käyttöliittymäksi: tapa olla vuorovaikutuksessa ohjelman kanssa syöttämällä tekstimuotoisia komentoja peräkkäin.
- Ohjelma, joka käsittelee käyttäjän antamat komennot, on nimeltään komentotulkki (shell) tai komentokehote.
- Komentorivi mahdollistaa erityisesti monimutkaisten tai toistuvien toimenpiteiden suorittamisen, joka graafisesta käyttöliittymästä käsin voi olla hankalaa tai mahdotonta.
- Komennon nimi on muistettava (vrt. valikot). Komento annetaan muodossa
komento vivut parametrit.
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)
| Ominaisuus | Komentorivi (CLI) | Graafinen käyttöliittymä (GUI) |
|---|---|---|
| Helppous alussa | Vaikea oppia, vaatii enemmän muistamista | Helppo oppia, intuitiivisempi |
| Käyttöliittymä | Jokaisen ohjelman käyttöliittymä samanlainen | Käyttöliittymät erilaisia |
| Löydettävyys | Toiminnot pitää tietää etukäteen | Toiminnot näkyvät valikoissa |
| Nopeus | Osaavan käsissä erittäin nopea | Hitaahko |
| Kontrolli | Antaa laajan kontrollin | Rajatumpi, ohjelmakohtainen |
| Resurssit | Vaatii vähän resursseja | Vaatii paljon resursseja |
| Toistettavuus | Komennon voi tallentaa, jakaa ja ajaa uudelleen sellaisenaan | Klikkaussarjaa on vaikea dokumentoida tai toistaa |
| Automatisointi | Erittäin helposti skriptattavissa | Rajatusti 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ää?
- Windowsin PowerShell ja Windows Terminal; vanhempi komentokehote
cmd.exe. - Unix- ja Linux-koneiden pääte- eli shell-käyttö SSH-yhteydellä.
- macOS:n Terminal.
- Ohjelmointi- ja julkaisutyökalut: git, npm, pip, Docker, LaTeX.
- Tieteellinen laskenta: R, MATLAB, Python.
- Tietokannanhallintajärjestelmät:
psql,mysql,sqlite3. - Pilvipalveluiden hallinta ja palvelinten ylläpito, jossa graafista käyttöliittymää ei usein ole lainkaan tarjolla.
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ä
- Yhdellä komennolla voi käsitellä useita tiedostoja. Valitsetko kymmenen kertaa valikoista Tiedosto → Avaa, vai teetkö saman yhdellä rivillä?
- Komennot ovat toistettavia ja jaettavia. Voit liittää komennon sähköpostiin tai ohjeeseen; klikkaussarjaa et voi.
- Komentohistoria. Voit toistaa aiemmat komennot samanlaisina tai pienin muutoksin.
- Etäkäyttö on kevyttä. SSH-yhteys toimii mobiiliverkossakin.
- Osaaminen siirtyy. Kun opit komentorivin logiikan, osaat käyttää kaikkia komentoriviohjelmia. Graafisessa käyttöliittymässä joudut opettelemaan jokaisen ohjelman erikseen.
- Aina ei voi valita. Osa ylläpitotehtävistä on tehtävissä vain komentoriviltä.
- Työkalut yhdistyvät. Putkitus mahdollistaa uusien työkalujen rakentamisen vanhoista; tälle ei ole vastinetta graafisessa maailmassa.
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?
- UNIX on käyttöjärjestelmä (vrt. Windows). Unixin tyyppisiä järjestelmiä ovat muun muassa Linux-jakelut (Ubuntu, Debian, Fedora, Rocky Linux), Android, macOS, FreeBSD ja NetBSD.
- UNIX on monen käyttäjän käyttöjärjestelmä. Samaa konetta voi käyttää samanaikaisesti jopa satoja henkilöitä. Tästä seuraa tarve tiedosto-oikeuksille.
- UNIXia voi käyttää joko merkkipohjaisesti komentoriviltä tai graafisen käyttöliittymän kautta.
Jyväskylän yliopistossa opiskelijat saavat tunnuksen Linux-palvelimelle. Yleinen periaate on seuraava:
- Palvelin tarjoaa palveluja (esimerkiksi WWW- tai SSH-palvelun).
- Palveluja käytetään etänä asiakasohjelmalla (selain tai SSH-ohjelma).
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.
-
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.
-
Käynnistä Windows Terminal tai PowerShell. Macissa ja Linuxissa käynnistä Terminal.
-
Kirjoita komentoriville seuraava komento (korvaa
omatunnusomalla käyttäjätunnuksellasi) ja paina Enter:ssh omatunnus@halava.cc.jyu.fiVoit ottaa yhteyden myös koneeseen
jalava.cc.jyu.fi. Koneet ovat identtiset eikä ole väliä kumpaa käytät. -
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
yesja painamalla Enter. -
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 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ä:
| Ohjelma | Kopiointi | Liittäminen |
|---|---|---|
| Useimmat ohjelmat | Ctrl+Insert | Shift+Insert tai hiiren oikea painike |
| Windows Terminal, PowerShell | Ctrl+Shift+C | Ctrl+Shift+V tai hiiren oikea painike |
| macOS Terminal, iTerm2 | Cmd+C | Cmd+V |
| Linuxin pääteohjelmat | Ctrl+Shift+C | Ctrl+Shift+V tai keskipainike |
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
- Työskentely tapahtuu pelkän näppäimistön avulla. SSH-ohjelman valikoista ei ole apua: yhteysohjelma vain näyttää, mitä palvelimella tapahtuu. Hiirellä ei voi siirtää kohdistinta.
- Kirjautumisen jälkeen kone kertoo päivän viestin (Message of the Day, MOTD). Jalava- ja halava-koneissa MOTD:a ei ole, vaan tulee vain ilmoitus edellisestä kirjautumiskerrasta.
- Komentokehote jää odottamaan komentoja. Kehotteen sisältö vaihtelee, mutta se
päättyy yleensä merkkiin
$tai%. Tässä materiaalissa kehote on aina muotoa:[opiskelija@halava ~]$ - Komento päätetään Enter-painalluksella.
- Jos vastetta ei tule, oletuksena kaikki meni oikein. Unix-komennot ilmoittavat yleensä vain virheistä. Tämä hämmentää alussa, mutta on tarkoituksellista: hiljaisuus on hyvä uutinen.
- Isoilla ja pienillä kirjaimilla on merkitystä.
lson eri komento kuinLS, jaKuva.JPGon eri tiedosto kuinkuva.jpg. Tämä on web-julkaisemisessa erittäin tärkeää; katso luku 30. - Komennon osat erotetaan välilyönnillä. Väliviiva (
-) on tavallisesti valitsimen eli vivun etumerkki, esimerkiksils -al. Pitkät vivut alkavat kahdella väliviivalla:ls --all. - Lopetettuasi työskentelyn kirjaudu ulos komennolla
exittailogout.
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:
- Jako sanoiksi. Rivi pilkotaan välilyöntien kohdalta osiin. Tästä syystä välilyönti tiedostonimessä on ongelma.
- Laajennukset.
~korvataan kotihakemiston polulla,$MUUTTUJAmuuttujan arvolla ja*,?sekä[...]niitä vastaavilla tiedostonimillä. - Lainausmerkkien poisto. Lainaus estää edellisen vaiheen; itse lainausmerkit eivät päädy ohjelmalle asti.
- Edelleenohjausten käsittely.
>,>>ja|otetaan pois riviltä ja niistä tehdään kytkennät tiedostoihin ja prosesseihin. - Ohjelman etsiminen. Jäljelle jääneen rivin ensimmäistä sanaa etsitään PATH-ympäristömuuttujan kansioista.
- Käynnistys. Ohjelma saa loput sanat parametreinaan ja alkaa kirjoittaa vakiotulosteeseen ja virhevirtaan.
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)
| Komento | Kertoo |
|---|---|
whoami | Käyttäjätunnuksesi |
hostname | Koneen nimen (kumpi, halava vai jalava?) |
uname -nmo | Koneen nimen, laitearkkitehtuurin ja käyttöjärjestelmän |
pwd | Oletushakemistosi absoluuttisen polun |
who | Ketkä ovat kirjautuneina koneelle |
echo $SHELL | Kä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
| Näppäily | Toiminto |
|---|---|
| ↑ ja ↓ | Selaa edellisiä komentoja |
| Ctrl+R | Käänteinen haku historiasta: kirjoita osa komennosta, toinen Ctrl+R etsii vanhemman osuman, Enter ajaa, Ctrl+G peruu |
history | Listaa komennot numeroituna |
history | grep chmod | Etsii historiasta tietyn komennon |
!! | Toistaa edellisen komennon |
!42 | Toistaa historian komennon numero 42 |
!$ | Edellisen komennon viimeinen parametri |
[opiskelija@halava ~]$ mkdir html/kuvat
[opiskelija@halava ~]$ cd !$
cd html/kuvat
[opiskelija@halava kuvat]$
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
- Ctrl+R (usein kirjoitettuna
^R) tarkoittaa, että painat Ctrl-näppäimen pohjaan ja sitten kirjainta R. M-rtarkoittaa Unix-dokumentaatiossa Meta-näppäintä, joka nykykoneissa on Alt. Jos pääteohjelma ei lähetä Altia, voit painaa ensin Esc ja sitten kirjaimen.- Kursori tarkoittaa tekstin kohdistinta.
Bash-ympäristön tärkeimmät pikanäppäimet
| Näppäinyhdistelmä | Toiminto |
|---|---|
| Tab | Täydentää komentojen ja tiedostojen nimiä |
| Ctrl+A | Siirry rivin alkuun |
| Ctrl+E | Siirry rivin loppuun |
| Ctrl+U | Poistaa rivin kursorin kohdasta alkuun |
| Ctrl+K | Poistaa rivin kursorista eteenpäin |
| Ctrl+W | Poistaa kursoria edeltävän sanan |
| Ctrl+L | Puhdistaa näytön (sama kuin clear) |
| Ctrl+R | Käänteinen haku komentohistoriasta |
| Ctrl+C | Lä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+D | Lä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+Z | Pysäyttää etualan ohjelman (suspend). Ohjelma ei jatka ajoaan ennen kuin annat komennon fg (jatka etualalla) tai bg (jatka taustalla) |
| Ctrl+S | Pysäyttää päätteen tulostuksen. Näyttää siltä kuin kone olisi jumissa |
| Ctrl+Q | Vapauttaa päätteen Ctrl+S:n jälkeen |
- Ctrl+C ei ”tapa” ohjelmaa vaan pyytää sitä
kohteliaasti lopettamaan. Jos ohjelma ei tottele, tarvitaan
kill. - Ctrl+Z ei siirrä ohjelmaa taustalle jatkamaan ajoaan vaan
jäädyttää sen. Taustalle jatkamaan siirtää vasta
bg. - Ctrl+D ei ole yleinen ”peruuta”-näppäin. Se tarkoittaa ”syöte loppui”.
Erikoismerkit
Osa komennoissa tarvittavista merkeistä on suomalaisella näppäimistöllä hankalasti löydettävissä ja muistuttaa toisiaan paperilla.
| Merkki | Nimi 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.
| Näppäin | Toiminto |
|---|---|
| q | Poistuminen |
| Välilyönti | Sivu eteenpäin |
| b | Sivu taaksepäin |
| ↑ ja ↓ | Rivi kerrallaan |
| /hakusana | Etsi eteenpäin |
| n ja N | Seuraava ja edellinen osuma |
| g ja G | Alkuun ja loppuun |
| h | Ohje |
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ä:
- Onko ikkuna aktiivinen? Klikkaa pääteikkunaa.
- Tuliko vahingossa Ctrl+S? Paina Ctrl+Q.
- 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).
- Kestääkö ajo kauan? Odota hetki. Jos et halua odottaa, Ctrl+C.
- 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.
| Ohjelma | Poistuminen |
|---|---|
less, man, more | q |
nano | Ctrl+X |
vi, vim | Esc :q! Enter |
top | q |
python3, sqlite3 | Ctrl+D tai exit() |
| Yleinen keskeytys | Ctrl+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.
| Virheilmoitus | Mitä se tarkoittaa | Mitä 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 |
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.
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 ~]$
| Komento | Vaikutus |
|---|---|
cd | Kotihakemistoon |
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
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.
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.
| Tilanne | Suositus |
|---|---|
| Liikut lähellä nykyistä sijaintiasi | Suhteellinen: lyhyempi kirjoittaa |
| Kirjoitat skriptiä, joka voi käynnistyä mistä tahansa | Absoluuttinen: ei riipu sijainnista |
| Jaat komennon ohjeessa tai sähköpostissa | Absoluuttinen: toimii lukijalla samoin |
| Viittaat www-sivuilla saman projektin tiedostoihin | Suhteellinen: sivusto toimii myös siirrettynä |
Myös edellisen luvun relativetool-työkalu näyttää valitsemasi kohteen absoluuttisen osoitteen, joten voit verrata kahta esitystapaa rinnakkain.
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.
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
| Komento | Toiminto |
|---|---|
mkdir kuvat | Luo hakemiston |
mkdir -p a/b/c | Luo koko puun, myös puuttuvat välitasot |
touch uusi.txt | Luo tyhjän tiedoston tai päivittää olemassa olevan aikaleiman |
cp lahde kohde | Kopioi tiedoston |
cp -r kansio kohde/ | Kopioi hakemiston sisältöineen |
mv vanha uusi | Siirtää tai nimeää uudelleen |
rm tiedosto | Poistaa tiedoston pysyvästi |
rmdir kansio | Poistaa tyhjän hakemiston |
rm -r kansio | Poistaa 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
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ä:
rm * .txt(ylimääräinen välilyönti) poistaa kaiken hakemistosta, ei vain txt-tiedostoja.rm -rf ~tairm -rf /tuhoaa kaiken, mihin sinulla on kirjoitusoikeus. Vipu-fohittaa kaikki varmistuskysymykset.
Turvallisempi tapa harjoitella on rm -i, joka kysyy jokaisesta
tiedostosta erikseen.
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
| Komento | Toiminto |
|---|---|
cat tiedosto | Tulostaa koko sisällön kerralla. Sopii lyhyille tiedostoille |
less tiedosto | Selaa sisältöä sivu kerrallaan. Poistu q:lla |
head -n 20 tiedosto | Ensimmäiset 20 riviä |
tail -n 20 tiedosto | Viimeiset 20 riviä |
tail -f loki.txt | Seuraa tiedoston loppua reaaliajassa. Erinomainen lokien katseluun. Poistu Ctrl+C |
wc -l tiedosto | Laskee rivit; -w sanat, -c tavut |
file tiedosto | Arvaa tiedostotyypin sisällön perusteella, ei päätteen |
diff a.txt b.txt | Näyttää tiedostojen erot |
sort, uniq | Järjestävät rivit ja poistavat peräkkäiset kaksoiskappaleet |
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
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
| Näppäily | Toiminto |
|---|---|
| Ctrl+O | Tallenna (WriteOut). Kysyy tiedostonimen; hyväksy Enterillä |
| Ctrl+X | Poistu. Kysyy tallennuksesta, jos muutoksia on |
| Ctrl+W | Etsi merkkijonoa; Alt+W etsii seuraavan |
| Ctrl+K | Leikkaa rivi. Peräkkäiset painallukset keräävät useita rivejä |
| Ctrl+U | Liitä leikatut rivit kursorin kohdalle |
| Alt+U | Kumoa (undo); Alt+E tee uudelleen |
| Ctrl+/ | Siirry riville numero |
| Ctrl+G | Ohje |
| Ctrl+C | Näyttää kursorin sijainnin. Muiden toimintojen aikana peruuttaa aloitetun toiminnon |
| Ctrl+J | Tasaa kappaleen eli järjestelee rivinvaihdot uudelleen. Varo tätä HTML- ja kooditiedostoissa |
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.
| Merkki | Vastaa | Esimerkki |
|---|---|---|
* | 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 nimille | mkdir demo{1,2,3} |
Tällä kurssilla riittää, että ymmärrät merkit * ja ?.
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 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.
| Tapa | Vaikutus | Esimerkki |
|---|---|---|
'yksinkertaiset' | Estää kaiken tulkinnan; teksti menee ohjelmalle sellaisenaan | echo '$HOME on koti' tulostaa tekstin muuttumattomana |
"kaksinkertaiset" | Estää globbauksen ja sanoiksi jakamisen, mutta $MUUTTUJA laajenee yhä | echo "Koti: $HOME" tulostaa polun |
\ kenoviiva | Suojaa yhden seuraavan merkin | mv 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
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.
| Merkki | Globi (tiedostonimet) | Säännöllinen lauseke (grep, sed) |
|---|---|---|
* | Mikä tahansa merkkijono | Edellinen merkki 0 tai useampi kerta |
? | Yksi mikä tahansa merkki | Edellinen merkki 0 tai 1 kertaa (laajennetussa syntaksissa) |
. | Tavallinen piste | Yksi 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:
- Vakiosyöte (stdin, virta 0) – mistä ohjelma lukee.
- Vakiotuloste (stdout, virta 1) – minne ohjelma kirjoittaa tuloksensa.
- Virhevirta (stderr, virta 2) – minne ohjelma kirjoittaa virheilmoituksensa.
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.
| Merkintä | Toiminto |
|---|---|
komento > tiedosto | Ohjaa vakiotulosteen tiedostoon. Korvaa vanhan sisällön |
komento >> tiedosto | Lisää vakiotulosteen tiedoston perään |
komento 2> virheet.txt | Ohjaa vain virhevirran tiedostoon |
komento > ulos.txt 2>&1 | Ohjaa molemmat samaan tiedostoon |
komento &> ulos.txt | Sama lyhyemmin (bash) |
komento 2> /dev/null | Heittää virheilmoitukset pois |
komento < syote.txt | Lukee 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.
>tyhjentää kohdetiedoston heti, myös silloin kun komento epäonnistuu. Vahingossa kirjoitettu>pelkän>>:n sijaan hävittää tiedoston sisällön.sort tiedosto.txt > tiedosto.txttyhjentää tiedoston. Komentotulkki avaa kohteen tyhjäksi ennen kuinsortehtii lukea sitä. Käytä aina eri kohdenimeä.
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
| Vipu | Toiminto |
|---|---|
-i | Ei välitä kirjainkoosta |
-n | Näyttää rivinumerot |
-r | Etsii hakemistopuusta rekursiivisesti |
-v | Näyttää rivit, joilla kuviota ei ole |
-c | Laskee osumien määrän |
-l | Näyttää vain tiedostonimet, ei rivejä |
-E | Laajennettu säännöllisten lausekkeiden syntaksi |
Hakukuvio on säännöllinen lauseke, ei globi. Perusmerkinnät:
| Merkintä | Vastaa |
|---|---|
^teksti | Rivin alussa oleva teksti |
teksti$ | Rivin lopussa oleva teksti |
. | Yksi mikä tahansa merkki |
.* | Mikä tahansa määrä mitä tahansa merkkejä |
[0-9] | Yksi numero |
Kirjoita haku yksinkertaisiin lainausmerkkeihin: grep '^<h1'
index.html. Muuten komentotulkki ehtii tulkita merkit
*, $ ja < ennen greppiä.
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
| Merkintä | Toiminto |
|---|---|
a ; b | Suorita a, sitten b, riippumatta a:n onnistumisesta |
a && b | Suorita b vain jos a onnistui |
a || b | Suorita 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.
- merkit 2–4: omistajan oikeudet (user);
- merkit 5–7: ryhmän oikeudet (group);
- merkit 8–10: kaikkien muiden oikeudet (others).
Kussakin ryhmässä on kolme paikkaa: r (read), w (write) ja
x (execute). Viiva - tarkoittaa, ettei kyseistä oikeutta ole.
| Oikeus | Tiedostolla | Hakemistolla |
|---|---|---|
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ä:
| Kenelle | Miten | Mitä |
|---|---|---|
u omistaja (user) | + lisää | r luku |
g ryhmä (group) | - poista | w kirjoitus |
o muut (other) | = aseta täsmälleen, poistaa muut | x 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.
| Luku | Symbolinen | Käyttötarkoitus |
|---|---|---|
644 | rw-r--r-- | Tavallinen www-tiedosto: omistaja muokkaa, muut lukevat |
755 | rwxr-xr-x | Hakemisto tai ohjelma: omistaja kaikki, muut luku ja läpikulku |
600 | rw------- | Yksityinen tiedosto, esimerkiksi SSH-avain |
700 | rwx------ | Yksityinen hakemisto |
[opiskelija@halava ~]$ chmod 644 index.html
[opiskelija@halava ~]$ chmod 755 kuvat
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:
- www-juurella
~/htmlja kaikilla sen alihakemistoillarjaxmuille eli755; - tiedostoilla
rmuille eli644.
Korjaus kerralla:
[opiskelija@halava ~]$ chmod -R a+rX ~/html/
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ä.
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.
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
| Muuttuja | Sisältö |
|---|---|
HOME | Kotihakemiston polku; sama minkä ~ tuottaa |
USER | Käyttäjätunnus |
PATH | Kansiot, joista ohjelmia etsitään |
SHELL | Käytössä oleva komentotulkki |
EDITOR | Oletuseditori, jonka muut ohjelmat käynnistävät |
LANG | Kieli- ja merkistöasetus, esimerkiksi fi_FI.UTF-8 |
TMPDIR | Vä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.
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.
| Komento | Signaali | Vaikutus |
|---|---|---|
kill 12587 | SIGTERM (15) | Oletus. Pyytää ohjelmaa lopettamaan siististi. Ohjelma ehtii tallentaa työnsä |
kill -1 12587 | SIGHUP (1) | ”Yhteys katkesi.” Monet palvelinohjelmat lukevat tästä asetuksensa uudelleen sen sijaan että lopettaisivat |
kill -9 12587 | SIGKILL (9) | Viimeinen keino. Ydin lopettaa prosessin välittömästi; se ei voi estää tätä eikä ehdi tallentaa mitään |
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.
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
- Ctrl+Z pysäyttää ohjelman. Se ei etene yhtään ennen kuin annat seuraavan komennon.
bgjatkaa ohjelman ajoa taustalla, jolloin saat kehotteen takaisin.fgtuo ohjelman takaisin etualalle.- Ohjelman voi käynnistää suoraan taustalle lisäämällä rivin loppuun
&.
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ä.
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
| cmd.exe | Unix | Esimerkki | Toiminta |
|---|---|---|---|
\ | / | Hakemistoerotin | |
/ | - | ls -al | Vipujen etumerkki |
. | . | cp ../index.html . | Oletushakemisto |
.. | .. | cd .. | Isähakemisto |
D: | – | Levyaseman vaihto; Unixissa kaikki on yhdessä puussa | |
dir | ls -la | ls -la tyovaline | Hakemistolistaus |
cd | cd | cd tyovaline/luennot | Vaihtaa oletushakemiston |
md, mkdir | mkdir | mkdir -p a/b/c | Luo hakemiston |
rd, rmdir | rmdir | rmdir luento1 | Poistaa tyhjän hakemiston |
copy | cp | cp demo1.txt luennot/ | Kopioi tiedostoja |
type | cat | cat luento1.txt | Tulostaa sisällön |
ren | mv | mv demot demoja | Nimeää uudelleen |
move | mv | mv luento1.txt ../demot/ | Siirtää tiedoston |
del | rm | rm luento1.txt | Poistaa tiedoston |
find, findstr | grep | grep foo bar.txt | Etsii rivejä |
cls | clear | clear | Tyhjentää näytön |
| – | chmod | chmod 644 index.html | Muuttaa oikeuksia |
edit, notepad | nano | nano luento1.txt | Tekstieditori |
ohjelma /? | man ohjelma | man ls | Kä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/
| Vipu | Merkitys |
|---|---|
-a | Arkistotila: rekursiivinen, säilyttää oikeudet ja aikaleimat |
-v | Kertoo, mitä tekee |
-z | Pakkaa siirron ajaksi |
-n | Kuivaharjoitus: näyttää mitä tapahtuisi, muttei tee mitään |
--delete | Poistaa kohteesta tiedostot, joita lähteessä ei ole |
- Lähdepolun lopussa oleva kauttaviiva ratkaisee.
sivusto/kopioi hakemiston sisällön,sivustoilman viivaa kopioi hakemiston itsensä kohteen sisään. --deletepoistaa tiedostoja kohteesta. Aja komento aina ensin vivulla-nja katso, mitä olisi tapahtumassa.
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.
- Miten selvität, missä hakemistossa olet ja mitä siellä on? (luku 10)
- Mitä eroa on viittauksilla
luennot/luento1ja~/tyovaline/luennot/luento1? (luvut 18–19) - Miksi
cd ../luennottoimii toisesta hakemistosta muttei toisesta? (luku 18) - Mitä komentotulkki tekee riville
rm *.txtennen kuinrmkäynnistyy? Miten voit tarkistaa tuloksen etukäteen? (luvut 9 ja 24) - Mitä tapahtuu, jos ajat
rm * .txt? (luku 20) - Mitä eroa on merkinnöillä
>ja>>? (luku 26) - Miksi virheilmoitus näkyy ruudulla, vaikka ohjasit tulosteen tiedostoon? (luku 26)
- Mitä oikeudet
drwxr-xr-xtarkoittavat hakemistolle? (luku 29) - Sivusi antaa selaimessa virheen 403. Mitkä kolme asiaa tarkistat? (luku 30)
- Kuvasi ei näy palvelimella, vaikka se näkyi omalla koneellasi. Mikä on todennäköisin syy? (luku 30)
- Ohjelma ei reagoi Ctrl+C:hen. Missä järjestyksessä etenet? (luku 32)
- 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
-ltai--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.
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 ~/htmlon 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.4voidaan 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ä.
- Rikkinäinen linkki. Jos kohde poistetaan tai siirretään,
linkki jää osoittamaan tyhjään ja
cdantaa virheenNo such file or directory, vaikka linkki näkyy listauksessa. Tarkistals -l- tairealpath-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 ~/htmlpoistaa 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/.
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.
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ä
- The Unix Shell (Software Carpentry) – laaja englanninkielinen harjoituskurssi.
- Tietokone työvälineenä: komentorivi – suomenkielinen perusmateriaali harjoituksineen.
- Learning the Shell ja saman tekijän kirja The Linux Command Line (ilmainen PDF).
- Learn Enough Command Line to Be Dangerous.
- explainshell.com – liitä pitkä komento, saat selityksen jokaisesta osasta. Erinomainen työkalu netistä löytyneiden komentojen tarkistamiseen ennen ajamista.
- tldr – manuaalisivujen tiivistelmät, joissa on suoraan käytännön esimerkit.
- ShellCheck – tarkistaa kirjoittamasi skriptin yleisimpien virheiden varalta.
- Globbing – korvausmerkkien tarkka kuvaus.
- Bash Pitfalls – luettelo tyypillisistä virheistä ja siitä, miksi ne menevät pieleen.
- Unix-käyttöjärjestelmän alkeita ja Windowsin käyttäminen komentotulkin avulla.
Käyttäjien kommentit