Ero sivun ”Komentorivin perusteet” versioiden välillä

Linux.fista
Siirry navigaatioon Siirry hakuun
(→‎Putkitus: pientä fixausta)
Rivi 36: Rivi 36:


=== Putkitus ===
=== Putkitus ===
Putket (''engl. pipes'') ovat tapa jolla yhden ohjelmat tuloste voidaan ohjata toiselle ohjelmalle syötteeksi. Esimerkiksi komento uname -a näyttää [[Kernel|ytimen]] version:
Putket (''engl. pipes'') ovat tapa, jolla yhden ohjelmat tuloste voidaan ohjata toiselle ohjelmalle syötteeksi.  
 
Esimerkiksi komento uname -a näyttää [[Kernel|ytimen]] version:
  $uname -r
  $uname -r
  2.6.15-ck3-r1
  2.6.15-ck3-r1
Rivi 59: Rivi 61:
                   | |----w |
                   | |----w |
                   | |      | |
                   | |      | |
|-ohjausmerkki siis antaa ensin suoritetun komennon tulosteen jälkimmäisenä olevan ohjelman syötteeksi. Hyötyä tästä on esimerkiksi tapauksessa, jossa komento antaa pitkän tulosteen ja haluaa antaa sen [[more|morelle]] syötteeksi. Esimerkiksi kaikki järjestelmän prosessit saa kätevästi selattavaksi putkittamalla komennon "ps aux" tulosteen more:lle:
|-ohjausmerkki siis antaa ensin suoritetun komennon tulosteen jälkimmäisenä olevan ohjelman syötteeksi. Hyötyä tästä on esimerkiksi tapauksessa, jossa jonkin komennon antama yli yhden ruudullisen pituinen tulostus halutaan antaa [[less|lessille]] syötteeksi. Esimerkiksi kaikki järjestelmän prosessit saa kätevästi selattavaksi putkittamalla komennon "ps aux" tulosteen lessille:
  ps aux | more
  ps aux | less
Tai kun pitkästä tulosteesta haluaa etsiä jotain [[Grep|grepin]] avulla:
Tai kun pitkästä tulosteesta haluaa etsiä jotain [[Grep|grepin]] avulla:
  ls | grep tiedosto
  ls | grep merkkijono
Joka tulostaisi vain niiden tiedostojen tiedot, joiden nimessä esiintyy sana tiedosto.
Joka tulostaisi vain niiden tiedostojen nimen, joiden nimessä esiintyy sana merkkijono.


Putkituksen käyttöä kannattaa opetella systemaattisesti, suurin osa /bin ja /usr/bin hakemistojen ohjelmista toimii tehokkaasti osana jotain toista ohjelmaa ja kytkentä niiden välillä tehdään helpoiten putkituksen avulla eikä pitkiäkään putkituksia kannata pelätä. Putkituksen opettelua voi aloittaa tutkimalla komentoja grep, gawk,cat,zcat,more,less,sort,od,du,wc ja ls
Putkituksen käyttöä kannattaa opetella systemaattisesti, sillä suurin osa komentoriviohjelmista toimii tehokkaasti osana jotain toista ohjelmaa, ja kytkentä niiden välillä tehdään helpoiten putkituksen avulla. Pitkiäkään putkituksia ei kannata pelätä. Putkituksen opettelua voi aloittaa tutkimalla komentoja [[grep]], [[awk]], [[cat]], [[zcat]], [[less]], [[more]], [[sort]], [[od]], [[du]], [[wc]] ja [[ls]].
esimerkiksi:
 
  du /etc |sort -n -r |head -5
====Esimerkkejä====
 
  du /etc |sort -nr |head -5
  23281  /etc
  23281  /etc
  6851    /etc/opt
  6851    /etc/opt
Rivi 74: Rivi 78:
  2569    /etc/X11
  2569    /etc/X11


du /etc :llä tutkitaan minkä verran mikäkin /etc:n hakemisto vie tilaa, ongelmana on kuitenkin että hakemistot ovat hakujärjestyksessä eikä kokojärjestyksessä. Tämä ratkaistaan komennolla sort -nr joka lajittelee 'tiedoston' eli sen mitä du sille kertoi järjestykseen (-n -r tarkoitttaa numeerisesti isoimmasta pienimpään), ja lopuksi head -5 näytää vain viisi ensimmäistä riviä. Toiminnallisesti sama tulos tulee myös komennolla:
Tässä tutkitaan [[du]]-komennon avulla sitä, kuinka paljon mikäkin /etc:n hakemisto vie tilaa. Ongelmana tässä on kuitenkin se, että hakemistot ovat oletuksena haku- eikä kokojärjestyksessä. Tämä ratkaistaan komennolla sort -nr, joka lajittelee sille annetun syötteen, eli tässä tapauksessa du:n tulosteen, numeerisesti (valitsin -n) isoimmasta pienimpään (valitsin -r kääntää tulostusjärjestyksen, joka oletuksena olisi pienimmästä isoimpaan). Lopuksi käytetään komentoa ''head -5'' näyttämään sortin tulostuksesta vain viisi ensimmäistä riviä.  
 
Toiminnallisesti sama tulos tulee myös komennolla
  du /etc |sort -n |tail -5
  du /etc |sort -n |tail -5
  2569    /etc/X11
  2569    /etc/X11
Rivi 82: Rivi 88:
  23281  /etc
  23281  /etc


 
Nyt kuitenkin sillä erotuksella, että tässä tapauksessa [[tail]] ottaakin [[sort]]in tuloksesta viimeiset rivit, ja sortin tulostusjärjestystä ei käännetä valitsimella -r.
Mutta tässä tapauksessa tail ottaakin sortin tuloksesta viimeiset rivit.  


  du /etc |sort -n |tail -5 |grep X11
  du /etc |sort -n |tail -5 |grep X11
  2569    /etc/X11
  2569    /etc/X11


Lisäämällä suodatin grep X11 tulostukseen jää vain rivi jossa on X11 avain, ja edelleen
Kun lopuksi poistetaan komennosta vielä [[grep]]in avulla kaikki muut rivit paitsi ne, jotka sisältävät merkkijonon X11, saadaan ylläoleva tulostus.


  du /etc |sort -n |tail -5 |grep -v X11
  du /etc |sort -n |tail -5 |grep -v X11
Rivi 96: Rivi 101:
  23281  /etc
  23281  /etc


Suodattimen -v optiolla saadaankin X11 rivi pois tulostuksesta.  
Tässä taas grepille on annettu valitsin -v, jolla määritellään grep näyttämään kaikki rivit paitsi ne, joihin sisältyy merkkijono X11.


  ls /etc |wc -l
  ls /etc |wc -l
  270
  270


puolestaan kertoo kuinka monta tiedostoa /etc hakemistossa on. (wc -l laskee tiedoston rivit)
Tämä puolestaan kertoo, kuinka monta tiedostoa on hakemistossa /etc (wc -l laskee tiedoston rivit).


=== Komentojen ketjutus ===
=== Komentojen ketjutus ===

Versio 16. maaliskuuta 2006 kello 12.06

Komentorivi on yksi GNU/Linux-järjestelmän tehokkaimmista työkaluista, mutta se voi olla Windows-maailmasta Linuxiin siirtyneelle outo. Windowssissa komentotulkki on lähinnä vitsi jolla ei voi tehdä juuri mitään, mutta Linuxissa komentoriviltä hoituu lähes kaikki mahdolliset tehtävät jopa kätevämmin kuin graafisesti.

Komentotulkit

Komentotulkki on ohjelma, joka hoitaa komentoriviltä annettujen komentojen suorittamisen. Komentorivin käyttö riippuu siitä, mikä komentotulkki on käytössä. Lähes jokaisessa jakelussa oletuksena on käytössä Bash, joten tämän ohjeen asiat toimivat bashin kanssa. Kuitenkin komentotulkkien välillä ei perusasioissa ole paljoakaan eroa joten ohjeiden pitäisi toimia monissa muissakin komentotulkeissa.

Komentorivin perusteet

Hakemistorakenteessa liikkuminen

Hakemistorakenteessa liikkuminen hoituu suurimmaksi osaksi komennolla cd. Esimerkiksi /usr-hakemistoon siirrytään komennolla

$cd /usr

Nykyisen hakemiston alihakemistoon taas voidaan siirtyä ilman /-merkkiä:

$cd alihakemisto

Hakemistorakenteessa pääsee yhden hakemiston ylöspäin komennolla cd ..

Hakemiston tiedostot ja alihakemistot näkee komennolla ls. Parametri -l näyttää tarkemmat tiedot jokaisesta tiedostosta (tiedoston oikeudet, omistajan, koon ja muokakuspäivän), ja -a näyttää myös piilotetut tiedostot. Esimerkiksi:

$ls -l
-rw-rw-rw-   1 kayttaja users    340         25. marras 18:36    tiedosto1
-rwxr-xr-x    1 kayttaja users    652348   25. tammi   2004     tiedosto2.bin
-rw-r--r--      1 kayttaja users   1709160 20. kesä    2002       tiedosto3

Komentojen suorittaminen

Mikäli ohjelma löytyy hakemistosta, joka on määritelty $PATH-ympäristömuuttujassa, sen voi suorittaa suoraan ajamalla komennon ohjelmannimi (esimerkiksi ls on ohjelma, joka sijaitsee yleensä polussa /bin). Yleensä näin voidaan suorittaa koko järjestelmään asennetut ohjelmat. $PATH:in sisällön voi tarkistaa seuraavasti:

$echo $PATH
/usr/kde/3.5/bin:/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/i686-pc-linux-gnu/gcc-bin/3.4.5:/opt/sun-jdk-1.5.0.06/bin:
/opt/sun-jdk-1.5.0.06/jre/bin:/usr/kde/3.5/bin:/usr/qt/3/bin:/usr/kde/3.4/bin:/usr/games/bin:/opt/vmware/workstation/bin:
/usr/share/karamba/bin

Mikäli ajettaja ohjelma ei sijaitse $PATH:in määrittelemissä hakemistoissa, se voidaan suorittaa joko viittaamalla siihen koko sen polulla (esim. /home/kayttaja/imuroitua/hienosofta.bin), tai mikäli kyseinen ohjelma on hakemistossa, johon on jo siirrytty, lisäämällä tiedostonimen eteen ./ joka viittaa nykyiseen hakemistoon (humaa kuitenkin että suoritettavalla tiedostolla on oltava suoritusoikeudet). Esimerkiksi jos hakemistossa /home/kayttaja olisi suoritettava tiedosto nimeltä ohjelma se voitaisiin suorittaa seuraavilla tavoilla:

$cd /home/kayttaja
$./ohjelma

tai

$/home/kayttaja/ohjelma

Vinkki: Käyttäjän omaan kotihakemistoon (/home/kayttaja) voi viitata tidlellä: cd ~

Ohjelman voi myös jättää pyörimään taustalle laittamalla rivin perään merkin &. Tällöin ohjelman tuloste tulee konsoliin, mutta komentorivin normaali käyttö on mahdollista.

Putkitus

Putket (engl. pipes) ovat tapa, jolla yhden ohjelmat tuloste voidaan ohjata toiselle ohjelmalle syötteeksi.

Esimerkiksi komento uname -a näyttää ytimen version:

$uname -r
2.6.15-ck3-r1

Toisaalta cowsay on mukava pikkuohjelma jolla saa tekstiä lehmän sanomaksi:

$cowsay Moi, wiki.linux.fi!
  ______________
< Moi, wiki.linux.fi! >
   ---------------------
       \   ^__^
        \  (oo)\_____
           (__)\           )\/\
                  | |----w |
                  | |       | |

Kun nämä komennot putkitetaan |-ohjausmerkillä, saadaan aikaan seuraavanlainen tulostus

$uname -r | cowsay
  ____________
< 2.6.15-ck3-r1 >
  -------------------
       \   ^__^
        \  (oo)\_____
           (__)\           )\/\
                  | |----w |
                  | |       | |

|-ohjausmerkki siis antaa ensin suoritetun komennon tulosteen jälkimmäisenä olevan ohjelman syötteeksi. Hyötyä tästä on esimerkiksi tapauksessa, jossa jonkin komennon antama yli yhden ruudullisen pituinen tulostus halutaan antaa lessille syötteeksi. Esimerkiksi kaikki järjestelmän prosessit saa kätevästi selattavaksi putkittamalla komennon "ps aux" tulosteen lessille:

ps aux | less

Tai kun pitkästä tulosteesta haluaa etsiä jotain grepin avulla:

ls | grep merkkijono

Joka tulostaisi vain niiden tiedostojen nimen, joiden nimessä esiintyy sana merkkijono.

Putkituksen käyttöä kannattaa opetella systemaattisesti, sillä suurin osa komentoriviohjelmista toimii tehokkaasti osana jotain toista ohjelmaa, ja kytkentä niiden välillä tehdään helpoiten putkituksen avulla. Pitkiäkään putkituksia ei kannata pelätä. Putkituksen opettelua voi aloittaa tutkimalla komentoja grep, awk, cat, zcat, less, more, sort, od, du, wc ja ls.

Esimerkkejä

du /etc |sort -nr |head -5
23281   /etc
6851    /etc/opt
4440    /etc/opt/gnome
4073    /etc/opt/gnome/gconf
2569    /etc/X11

Tässä tutkitaan du-komennon avulla sitä, kuinka paljon mikäkin /etc:n hakemisto vie tilaa. Ongelmana tässä on kuitenkin se, että hakemistot ovat oletuksena haku- eikä kokojärjestyksessä. Tämä ratkaistaan komennolla sort -nr, joka lajittelee sille annetun syötteen, eli tässä tapauksessa du:n tulosteen, numeerisesti (valitsin -n) isoimmasta pienimpään (valitsin -r kääntää tulostusjärjestyksen, joka oletuksena olisi pienimmästä isoimpaan). Lopuksi käytetään komentoa head -5 näyttämään sortin tulostuksesta vain viisi ensimmäistä riviä.

Toiminnallisesti sama tulos tulee myös komennolla

du /etc |sort -n |tail -5
2569    /etc/X11
4073    /etc/opt/gnome/gconf
4440    /etc/opt/gnome
6851    /etc/opt
23281   /etc

Nyt kuitenkin sillä erotuksella, että tässä tapauksessa tail ottaakin sortin tuloksesta viimeiset rivit, ja sortin tulostusjärjestystä ei käännetä valitsimella -r.

du /etc |sort -n |tail -5 |grep X11
2569    /etc/X11

Kun lopuksi poistetaan komennosta vielä grepin avulla kaikki muut rivit paitsi ne, jotka sisältävät merkkijonon X11, saadaan ylläoleva tulostus.

du /etc |sort -n |tail -5 |grep -v X11
4073    /etc/opt/gnome/gconf
4440    /etc/opt/gnome
6851    /etc/opt
23281   /etc

Tässä taas grepille on annettu valitsin -v, jolla määritellään grep näyttämään kaikki rivit paitsi ne, joihin sisältyy merkkijono X11.

ls /etc |wc -l
270

Tämä puolestaan kertoo, kuinka monta tiedostoa on hakemistossa /etc (wc -l laskee tiedoston rivit).

Komentojen ketjutus

Useita komentoja voidaan suorittaa peräkkäin esimerkiksi &&-ohjausmerkillä. Se tarkoittaa, että ensin suoritetaan ensimmäinen ohjelma ja sitten, mikäli se ei palauta virhettä, jälkimmäinen. Esimerkiksi Gentoon paketinhallinnan tietokanta voidaan päivittää komennolla emerge --sync ja tämän jälkeen päivittää koko järjestelmä komennolla emerge -uDNav world. Nämä voidaan yhdistää seuraavalla tavalla:

#emerge --sync && emerge -uDNav world

Joka ensin päivittää tietokannan eli ajaa komennon emerge --sync. Mikäli se ei palauta virhettä, ajetaan jälkimmäinen päivityskomento.