Tärkeä osa Ubuntun ja yleensä Linux-jakeluiden käytön opettelua on oppia työskentelemään shell-ympäristössä. Vaikka Linuxin mukana tulevat graafiset työpöytäympäristöt, kuten GNOME, tarjoavat käyttäjäystävällisen käyttöliittymän käyttöjärjestelmään, käytännössä komentotulkkiympäristö tarjoaa paljon suuremmat mahdollisuudet, joustavuuden ja automatisoinnin kuin mitä graafisilla työpöytätyökaluilla voidaan koskaan saavuttaa. Komentotulkkiympäristö tarjoaa myös keinon olla vuorovaikutuksessa käyttöjärjestelmän kanssa silloin, kun työpöytäympäristö ei ole käytettävissä; tämä on yleistä silloin, kun työskennellään Ubuntun kaltaisen palvelinpohjaisen käyttöjärjestelmän kanssa tai kun vioittunut järjestelmä ei käynnisty kokonaan.

Tämän luvun tavoitteena on siis antaa yleiskatsaus Ubuntun oletusarvoiseen komentotulkkiympäristöön (erityisesti Bash-komentotulkkiin).

1.1 Mikä on komentotulkki?

Komentotulkki on vuorovaikutteinen komentotulkkiympäristö, jossa komentoja voidaan kirjoittaa komentokehotteeseen tai syöttää tiedostoon komentosarjan muodossa ja suorittaa. Komentotulkin alkuperä juontaa juurensa UNIX-käyttöjärjestelmän alkuaikoihin. Itse asiassa Linuxin alkuaikoina ennen graafisten työpöytien käyttöönottoa komentotulkki oli käyttäjän ainoa tapa olla vuorovaikutuksessa käyttöjärjestelmän kanssa.

Vuosien varrella on kehitetty erilaisia komentotulkkiympäristöjä. Ensimmäinen laajalti käytetty komentotulkki oli Bourne-komentotulkki, jonka kirjoitti Stephen Bourne Bell Labsissa.

Toinen varhainen luomus oli C-komentotulkki, jolla oli joitain syntaktisia yhtäläisyyksiä C-ohjelmointikielen kanssa ja joka toi mukanaan helppokäyttöisyysparannuksia, kuten komentorivin muokkauksen ja historian.

Korn-kuori (jonka kehitti David Korn Bell Labsissa) perustuu sekä Bourne- että C-kuoren tarjoamiin ominaisuuksiin.

Ubuntun oletuskuori on Bash-kuori (lyhenne sanoista Bourne Again SHell). Tämä komentotulkki, joka sai alkunsa avoimen lähdekoodin versiona Bourne-komentotulkista, on Brian Foxin GNU-projektille kehittämä, ja se perustuu sekä Bourne- että C-komentotulkin tarjoamiin ominaisuuksiin.

1.2 Pääsy komentotulkkiin

Komentotulkkiin pääsee GNOME-työpöytäympäristöstä käsiksi terminaali-ikkunasta valitsemalla yläpalkin Toiminnot-vaihtoehdon, kirjoittamalla hakupalkkiin Terminaali ja napsauttamalla Terminaali-kuvaketta.

Käyttäjälle näytetään myös komentotulkkikehote, kun hän kirjautuu Ubuntu-palvelimelle etäkirjautumalla esimerkiksi SSH:n avulla. Yksityiskohtia SSH:n avulla tapahtuvasta etäpalvelimelle kirjautumisesta käsitellään luvussa ”SSH-avainpohjaisen todennuksen määrittäminen Ubuntussa”. Käynnistettäessä palvelinpohjaista järjestelmää, johon ei ole asennettu työpöytäympäristöä, komentotulkkiin siirrytään heti sen jälkeen, kun käyttäjä on suorittanut sisäänkirjautumismenettelyn fyysisessä konsolipäätteessä tai etäkirjautumisistunnossa.

1.3 Komentojen syöttäminen komentokehotteeseen

Komennot syötetään komentotulkin komentokehotteeseen yksinkertaisesti kirjoittamalla komento ja painamalla Enter-näppäintä. Vaikka jotkut komennot suorittavat tehtäviä äänettömästi, useimmat näyttävät jonkinlaisen tulosteen ennen kuin palaavat komentokehotteeseen. Esimerkiksi komennolla ls voidaan näyttää nykyisen työhakemiston tiedostot ja hakemistot:

$ ls

Työpöytä Asiakirjat Lataukset Musiikki Kuvat Julkiset mallit Videot

Käytettävissä olevat komennot ovat joko sisäänrakennettuja itse komentotulkkiin tai sijaitsevat fyysisessä tiedostojärjestelmässä. Komennon sijainti tiedostojärjestelmässä voidaan määrittää komennolla which. Voit esimerkiksi selvittää, missä tiedostojärjestelmässä ls-komento sijaitsee:

$ which ls alias ls='ls --color=auto' /usr/bin/ls

selkeästi ls-komento sijaitsee hakemistossa /usr/bin. Huomaa myös, että alias on määritetty, mitä käsitellään myöhemmin tässä luvussa. Käyttämällä komentoa which etsitään komentojen polku, jotka on rakennettu komentotulkkiin, saadaan viesti, joka ilmoittaa, että suoritettavaa komentoa ei löydy. Jos esimerkiksi yrität etsiä history-komennon (joka on itse asiassa sisäänrakennettu komentotulkkiin sen sijaan, että se olisi olemassa tiedostojärjestelmässä suoritettavana tiedostona) sijaintia, saat seuraavan kaltaisen tulosteen:

$ which history/usr/bin/which: no history in (/home/demo/.local/bin:/home/demo/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin)

1.4 Tietojen hankkiminen komennosta

Monet Linuxin komentotulkin käytettävissä olevat komennot voivat aluksi tuntua kryptisiltä. Jos haluat saada yksityiskohtaista tietoa siitä, mitä komento tekee ja miten sitä käytetään, käytä man-komentoa, jossa komennon nimi on argumenttina. Saat esimerkiksi lisätietoja pwd-komennosta:

$ man pwd

Kun yllä oleva komento suoritetaan, näyttöön tulee yksityiskohtainen kuvaus pwd-komennosta. Monet komennot antavat lisätietoja myös silloin, kun ne suoritetaan komentorivioptiolla -help:

$ wc --help

1.5 Bash-komentorivin muokkaus

Varhaiset komentotulkkiympäristöt eivät tarjonneet minkäänlaisia rivinmuokkausmahdollisuuksia. Tämä tarkoitti sitä, että jos huomasit kirjoittamasi pitkän komentorivin alussa virheen, sinun oli poistettava kaikki seuraavat merkit, korjattava virhe ja syötettävä komennon loppuosa uudelleen. Onneksi Bash tarjoaa laajan valikoiman komentorivin muokkausvaihtoehtoja, jotka on esitetty seuraavassa taulukossa:

Näppäinjono Toiminto
Ctrl-b tai Vasemmanpuoleinen nuoli Siirrä kursoria taaksepäin yhden paikan verran
Ctrl-f tai Oikea nuoli Siirrä kursoria yhden asennon eteenpäin
Delete Poista merkki, jota parhaillaan käytetään. kursorin alapuolella
Backspace Poista merkki kursorin vasemmalla puolella
Ctrl-_ Tapahtuneen muutoksen peruuttaminen (voidaan toistaa kaikkien aikaisempien muutosten peruuttamiseksi)
Ctrl-a Siirrä kohdistin rivin alkuun
Ctrl-e Siirrä kohdistin rivin loppuun
Meta-f tai Esc sitten f Siirrä kohdistinta yhden sanan eteenpäin
Meta-b tai Esc sitten b Siirrä kohdistinta yhden sanan taaksepäin
Ctrl-l Tyhjennä näyttö kaikesta muusta paitsi nykyisestä komennosta
Ctrl-k Tyhjennä rivin loppuun nykyisestä kursorin kohdasta
Meta-d tai Esc sitten d Poista nykyisen sanan loppuun
Meta-DEL tai Esc sitten DEL Poista alku nykyiseen sanaan
Ctrl-w Poisto nykyisestä kursorin kohdasta edelliseen valkoiseen välilyöntiin

Taulukko 9-1

1.6 Työskentely komentorivin historian kanssa

Komentorivin muokkausominaisuuksien lisäksi Bash-komentorivi tarjoaa myös komentorivin historiatuen. Luetteloa aiemmin suoritetuista komennoista voi tarkastella history-komennolla:

$ history1ps2ls3ls –l /4ls5man pwd6man apropos

Luetteloa aiemmin syötetyistä komennoista voi lisäksi selata taaksepäin ja eteenpäin aiemmin syötettyjä komentoja Ctrl-p:llä (eli nuolinäppäimellä ylös) ja Ctrl-n:llä (eli nuolinäppäimellä alas). Kun haluamasi komento historiasta on näkyvissä, suorita se painamalla Enter-näppäintä.

Toinen vaihtoehto on syöttää ’!’-merkki, jota seuraa toistettavan komennon ensimmäiset merkit ja sen jälkeen Enter-näppäin.

1.7 Tiedostonimien lyhennelmät

Monet komentotulkkikomennot ottavat argumentteina yhden tai useamman tiedostonimen. Esimerkiksi list.txt-nimisen tekstitiedoston sisällön näyttämiseen käytetään cat-komentoa seuraavasti:

$ cat list.txt

Monien tekstitiedostojen sisältö voidaan vastaavasti näyttää antamalla argumentteina kaikkien tiedostojen nimet:

$ cat list.txt list2.txt list3.txt list4.txt

Kaikkien tiedostojen nimien kirjoittamisen sijasta voidaan kuvioiden täsmäytyksellä määritellä kaikki tiedostot, joiden nimet täyttävät tietyt kriteerit. Esimerkiksi jokerimerkkiä ’*’ voidaan käyttää yksinkertaistamaan yllä olevaa esimerkkiä:

$ cat *.txt

Yllä oleva komento näyttää kaikkien .txt-päätteisten tiedostojen sisällön. Tämä voidaan edelleen rajata koskemaan kaikkia tiedostonimiä, jotka alkavat list ja päättyvät .txt:

$ cat list*.txt

Yksittäisiä merkkiyhteensopivuuksia voidaan määritellä käyttämällä ’?’-merkkiä:

$ cat list?.txt

1.8 Tiedostonimen ja polun täydentäminen

Koko tiedostonimen tai -polun kirjoittamisen sijasta tai käyttämällä hahmontäsmäystä kirjoittamisen vähentämiseksi komentotulkki tarjoaa tiedostonimen täydentämistoiminnon. Jos haluat käyttää tiedostonimen täydennystä, kirjoita tiedoston tai polun nimen ensimmäiset merkit ja paina sitten kahdesti Esc-näppäintä. Tämän jälkeen komentotulkki täydentää tiedostonimen puolestasi hakemiston ensimmäisellä tiedoston tai polun nimellä, joka vastaa syöttämiäsi merkkejä. Saat luettelon mahdollisista vastaavuuksista painamalla Esc = -näppäintä muutaman ensimmäisen merkin kirjoittamisen jälkeen.

1.9 Sisään- ja ulostulon uudelleenohjaus

Kuten aiemmin mainittiin, monet komentotulkkikomennot tulostavat suoritettaessa tietoja. Oletusarvoisesti tämä ulostulo menee laitetiedostoon nimeltä stdout, joka on käytännössä pääteikkuna tai konsoli, jossa komentotulkki on käynnissä. Vastaavasti komentotulkki ottaa syötteen stdin-nimisestä laitetiedostosta, joka on oletusarvoisesti näppäimistö.

Komennon tulo voidaan ohjata stdoutista fyysiseen tiedostoon tiedostojärjestelmässä käyttämällä ’>’-merkkiä. Jos esimerkiksi haluat ohjata ls-komennon tulosteen files.txt-nimiseen tiedostoon, tarvitaan seuraava komento:

$ ls *.txt > files.txt

Komennon valmistuttua files.txt sisältää luettelon nykyisen hakemiston tiedostoista. Vastaavasti tiedoston sisältö voidaan syöttää komentoon stdin:n sijasta. Voit esimerkiksi ohjata tiedoston sisällön komennon syötteenä:

$ wc –l < files.txt

Yllä oleva komento näyttää files.txt-tiedoston sisältämien rivien määrän.

On tärkeää huomata, että ’>’-uudelleenohjausoperaattoria käytettäessä luodaan uusi tiedosto tai katkaistaan olemassa oleva tiedosto. Jos haluat liittää olemassa olevaan tiedostoon, käytä ’>>’-operaattoria:

$ ls *.dat >> files.txt

Vakiotulosteen lisäksi komentotulkki tarjoaa myös vakiovirhetulosteen stderr:n avulla. Kun komennon ulostulo ohjataan stdoutiin, komennon tuottamat virheilmoitukset ohjataan stderriin. Tämä tarkoittaa, että jos stdout ohjataan tiedostoon, virheilmoitukset näkyvät silti päätelaitteessa. Tämä on yleensä haluttu käyttäytyminen, vaikka stderr voidaan haluttaessa myös ohjata uudelleen käyttämällä operaattoria ’2>’:

$ ls dkjfnvkjdnf 2> errormsg

Komennon päätyttyä errormsg-tiedostoon tulee virheilmoitus, jossa ilmoitetaan, että tiedostoa nimeltä dkjfnvkjdnf ei löytynyt.

Kaikki stderr- ja stdout-tiedostot voidaan ohjata samaan tiedostoon käyttämällä &>-operaattoria:

$ ls /etc dkjfnvkjdnf &amp;&gt; alloutput

Toteutuksen päätyttyä alloutput-tiedosto sisältää sekä listan /etc-hakemiston sisällöstä että virheilmoituksen, joka liittyy yritykseen listata tiedostoa, jota ei ole olemassa.

1.10 Putkien kanssa työskentely Bash-kuoressa

I/O:n uudelleenohjauksen lisäksi komentotulkki sallii myös yhden komennon ulostulon putkittamisen suoraan toisen komennon syötteeksi. Putkitoiminto saadaan aikaan sijoittamalla komentorivin kahden tai useamman komennon väliin ’|’-merkki. Jos esimerkiksi haluat laskea järjestelmässä käynnissä olevien prosessien määrän, ps-komennon ulostulo voidaan ohjata putkella wc-komentoon:

$ ps –ef | wc –l

Komentorivillä suoritettavien putkioperaatioiden määrää ei ole rajoitettu. Voit esimerkiksi etsiä tiedoston niiden rivien lukumäärän, jotka sisältävät nimen Smith:

$ cat namesfile | grep Smith | wc –l

1.11 Aliasien määrittäminen

Kun opit käyttämään komentotulkkiympäristöä, on todennäköistä, että annat usein komentoja samoilla argumenteilla. Saatat esimerkiksi käyttää usein komentoa ls optioilla l ja t:

$ ls –lt

Komennon antamiseen liittyvän kirjoitustyön vähentämiseksi on mahdollista luoda alias, joka vastaa komentoa ja argumentteja. Jos esimerkiksi halutaan luoda alias siten, että kirjaimen l kirjoittaminen aiheuttaa komennon ls -lt suorittamisen, käytetään seuraavaa lauseketta:

$ alias l="ls –lt"

Syöttäminen komentoriville l suorittaa nyt alkuperäisen lausekkeen.

1.12 Ympäristömuuttujat

Shellin ympäristömuuttujat mahdollistavat väliaikaisten tietojen ja konfiguraatioasetusten tallennuksen. Komentotulkki itse asettaa useita ympäristömuuttujia, joita käyttäjä voi muuttaa komentotulkin käyttäytymisen muuttamiseksi. Luettelo tällä hetkellä määritellyistä muuttujista saadaan komennolla env:

$ envSSH_CONNECTION=192.168.0.19 61231 192.168.0.28 22MODULES_RUN_QUARANTINE=LD_LIBRARY_PATHLANG=en_US.UTF-8HISTCONTROL=ignoredupsHOSTNAME=demo-pc.ebookfrenzy.comXDG_SESSION_ID=15MODULES_CMD=/usr/share/Modules/libexec/modulecmd.tclUSER=demoENV=/usr/share/Modules/init/profile.shSELINUX_ROLE_REQUESTED=PWD=/home/demoHOME=/home/demoSSH_CLIENT=192.168.0.19 61231 22SELINUX_LEVEL_REQUESTED= ...

Luettelon tällä hetkellä määritellyistä muuttujista saa käyttämällä komentoa env:

$ envSSH_CONNECTION=192.168.0.19 61231 192.168.0.28 22MODULES_RUN_QUARANTINE=LD_LIBRARY_PATHLANG=en_US.UTF-8HISTCONTROL=ignoredupsHOSTNAME=demo-pc.ebookfrenzy.comXDG_SESSION_ID=15MODULES_CMD=/usr/share/Modules/libexec/modulecmd.tclUSER=demoENV=/usr/share/Modules/init/profile.shSELINUX_ROLE_REQUESTED=PWD=/home/demoHOME=/home/demoSSH_CLIENT=192.168.0.19 61231 22SELINUX_LEVEL_REQUESTED= ...

Hyötyisin ympäristömuuttuja on ehkä PATH. Se määrittelee hakemistot, joista komentotulkki etsii komentoriville syötettyjä komentoja, sekä järjestyksen, jossa se etsii komentoja. Käyttäjätilin PATH-ympäristömuuttuja äskettäin asennetussa Ubuntu-järjestelmässä on todennäköisesti määritetty seuraavasti:

$ echo $PATH/home/demo/.local/bin:/home/demo/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/ bin:/usr/local/sbin:/usr/sbin

Toinen hyödyllinen muuttuja on HOME, joka määrittää nykyisen käyttäjän kotihakemiston. Jos haluat esimerkiksi, että komentotulkki etsii komentoja myös kotihakemistossasi sijaitsevasta skriptit-hakemistosta, muutat PATH-muuttujaa seuraavasti:

$ export PATH=$PATH:$HOME/scripts

Olemassa olevan ympäristömuuttujan senhetkisen arvon voi näyttää echo-komennolla:

$ echo $PATH

Oman ympäristömuuttujan voi luoda export-komennolla. Esimerkiksi:

$ export DATAPATH=/data/files

Hyödyllinen kikka komennon tulosteen osoittamiseksi ympäristömuuttujaan on käyttää takaviivoja (`) komennon ympärillä. Voit esimerkiksi määrittää nykyisen päivämäärän ja kellonajan ympäristömuuttujaan nimeltä NOW:

$ export NOW=`date`$ echo $NOWTue Apr 2 13:48:40 EDT 2020

Jos on olemassa ympäristömuuttujia tai alias-asetuksia, jotka on määritettävä joka kerta, kun siirryt komentotulkkiympäristöön, ne voidaan lisätä kotihakemistossasi olevaan tiedostoon nimeltä .bashrc. Esimerkiksi seuraavassa .bashrc-tiedostossa on määritetty DATAPATH-ympäristömuuttuja ja alias:

# .bashrc # Source global definitionsif ; then . /etc/bashrcfi # User specific environmentPATH="$HOME/.local/bin:$HOME/bin:$PATH"export PATH # Uncomment the following line if you don't like systemctl's auto-paging feature:# export SYSTEMD_PAGER= # User specific aliases and functionsexport DATAPATH=/data/filesalias l="ls -lt"

1.13 Shell-skriptien kirjoittaminen

Tähän mennessä olemme keskittyneet yksinomaan Bash-selaimen interaktiiviseen luonteeseen. Vuorovaikutteisuudella tarkoitamme komentojen manuaalista syöttämistä kehotteeseen yksi kerrallaan ja niiden suorittamista. Itse asiassa tämä on vain pieni osa siitä, mihin komentotulkki pystyy. Yksi komentotulkin tehokkaimmista puolista on luultavasti kyky luoda komentotulkkiskriptejä. Komentosarjan komentosarjat ovat lähinnä tekstitiedostoja, jotka sisältävät komentosarjaan kuuluvia lauseita, jotka voidaan suorittaa komentosarjaympäristössä tehtävien suorittamiseksi. Komentojen suorittamisen lisäksi komentotulkki tarjoaa monia ohjelmointikonstruktioita, kuten for- ja do-silmukat ja if-lausekkeet, joita voi kohtuudella odottaa löytyvän komentosarjakielestä.

Valitettavasti yksityiskohtainen katsaus komentotulkin komentosarjakäsikirjoittamiseen ei kuulu tämän luvun piiriin. Shell-skriptaukselle on kuitenkin omistettu monia kirjoja ja web-resursseja, jotka tekevät aiheesta paljon enemmän oikeutta kuin mitä tässä voisi koskaan toivoa saavuttavansa. Siksi tässä luvussa annamme vain hyvin pienen maistiaisen komentosarjakäsikirjoittamisesta.

Ensimmäinen askel komentosarjakäsikirjoituksen luomisessa on luoda tiedosto (tässä esimerkissä nimetään se simple.sh) ja lisätä ensimmäiseksi riviksi seuraava:

#!/bin/sh

#! kutsutaan ”shebangiksi”, ja se on erityinen merkkijono, joka ilmaisee, että komentosarjan suorittamiseen tarvittavan tulkin polku on rivin seuraava kohta (tässä tapauksessa osoitteessa /bin sijaitseva sh-ohjelma). Tämä voisi yhtä hyvin olla esimerkiksi /bin/csh tai /bin/ksh, jos kumpaakin tulkkia haluttaisiin käyttää.

Seuraavaksi kirjoitetaan yksinkertainen skripti:

#!/bin/shfor i in *do echo $idone

Tämä skripti tekee vain sen, että se käy läpi kaikki nykyisessä hakemistossa olevat tiedostot ja näyttää jokaisen tiedoston nimen. Tämä voidaan suorittaa välittämällä skriptin nimi argumenttina sh-komennolle:

$ sh simple.sh

Tiedoston tekemiseen suoritettavaksi (jolloin sen välittämistä sh-komennolle ei tarvitse tehdä) voidaan käyttää chmod-komentoa:

$ chmod +x simple.sh

Kun tiedoston käyttöoikeuksiin on asetettu execute-bitti, se voidaan suorittaa suoraan. Esimerkiksi:

$ ./simple.sh

1.14 Yhteenveto

Tässä Ubuntu Essentials -kirjan luvussa tutustuimme lyhyesti Bash-selainympäristöön. Graafisten työpöytäympäristöjen maailmassa on helppo unohtaa, että käyttöjärjestelmän todellista tehoa ja joustavuutta voi usein hyödyntää vain laskeutumalla käyttäjäystävällisen työpöytäliittymän alapuolelle ja käyttämällä komentotulkkiympäristöä. Lisäksi komentotulkin tuntemus on välttämätöntä, kun on hallinnoitava ja ylläpidettävä palvelinpohjaisia järjestelmiä, joihin ei ole asennettu työpöytää, tai kun yritetään korjata järjestelmää, joka on vaurioitunut niin, että työpöytä- tai Cockpit-käyttöliittymä ei enää käynnisty.

Vastaa

Sähköpostiosoitettasi ei julkaista.