Ero sivun ”Komentorivin perusteet” versioiden välillä

Siirry navigaatioon Siirry hakuun
1 351 merkkiä lisätty ,  24. toukokuuta 2009
yleistä viilailua
(→‎Jokerimerkit: testi -> .testi, ettei protesti joudu mukaan)
(yleistä viilailua)
Rivi 2: Rivi 2:


Windowsin komentoriviin tai DOS:iin tottuneiden kannattaa huomioida varsinkin jokerimerkkien erilainen logiikka ja se, etteivät [[Unix]]-komennot juurikaan kysele varmistuksia tai kerro tekemisistään, vaan tekevät ilman kommentteja sen, mitä pyydettiin.
Windowsin komentoriviin tai DOS:iin tottuneiden kannattaa huomioida varsinkin jokerimerkkien erilainen logiikka ja se, etteivät [[Unix]]-komennot juurikaan kysele varmistuksia tai kerro tekemisistään, vaan tekevät ilman kommentteja sen, mitä pyydettiin.
[[Kuva:Gnome-terminal.png|250px|right|thumb|Komentorivin käyttöä [[gnome-terminal]]illa]]


==Miten komentoriville pääsee?==
==Miten komentoriville pääsee?==
Rivi 132: Rivi 133:
                 ||----w |
                 ||----w |
                 ||    ||
                 ||    ||


Kun nämä komennot putkitetaan |-ohjausmerkillä, saadaan aikaan seuraavanlainen tulostus
Kun nämä komennot putkitetaan |-ohjausmerkillä, saadaan aikaan seuraavanlainen tulostus
Rivi 145: Rivi 145:
                 ||----w |
                 ||----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 [[less|lessille]] syötteeksi. Esimerkiksi kaikki järjestelmän prosessit saa kätevästi selattavaksi putkittamalla komennon <tt>[[ps]] aux</tt> tulosteen lessille:
Jos järjestelmässäsi ei ole asennettuna <tt>cowsay</tt>tä, voit asentaa sen [[paketinhallinta]]järjestelmästä paketista <tt>cowsay</tt>. Lisätietoja löytyy artikkelista [[Ohjelmien asentaminen]]. Jos et voi asentaa uusia ohjelmia järjestelmääsi, voit kokeilla putkitusta putkittamalla tulosteet vaikkapa [[rev]]ille, joka tulostaa putkituksella saamansa syötteen takaperin:
$ uname -r | tac
1r-3kc-51.6.2
 
|-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 <tt>[[ps]] aux</tt> tulosteen lessille (lessistä poistutaan painamalla q:ta):
  $ ps aux | less
  $ 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:
Rivi 156: Rivi 160:
Vastaavasti ohjelman tulostuksen voi ohjata tavallisen komentorivin ([[STDOUT]]) sijasta tiedostoon ohjausmerkillä >. Kokeile vaikka komentoa
Vastaavasti ohjelman tulostuksen voi ohjata tavallisen komentorivin ([[STDOUT]]) sijasta tiedostoon ohjausmerkillä >. Kokeile vaikka komentoa
  cowsay Moi > tiedosto
  cowsay Moi > tiedosto
, ja katso tämän jälkeen tiedoston ''tiedosto'' sisältö (<tt>[[cat]] tiedosto</tt>). >-merkin käyttö kirjoittaa tiedoston päälle, mutta >>-ohjausmerkkiä käyttämällä putkesta tulevan tiedon voi kirjoittaa tiedoston perään.
, ja katso tämän jälkeen tiedoston <tt>tiedosto</tt> sisältö (<tt>[[cat]] tiedosto</tt>). >-merkin käyttö kirjoittaa tiedoston päälle, mutta >>-ohjausmerkkiä käyttämällä putkesta tulevan tiedon voi kirjoittaa tiedoston perään.


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]] (katso myös luettelo [[komentorivikomennot|komentorivikomennoista]]).
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]] (katso myös luettelo [[komentorivikomennot|komentorivikomennoista]]).
Rivi 171: Rivi 175:
  2569    /etc/X11
  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ä.  
Tässä tutkitaan [[du]]-komennon avulla sitä, kuinka paljon mikäkin <tt>/etc</tt>:n [[hakemistorakenne|hakemisto]] vie tilaa. Ongelmana tässä on kuitenkin se, että hakemistot ovat oletuksena haku- eikä kokojärjestyksessä. Tämä ratkaistaan komennolla <tt>[[sort]] -nr</tt>, joka lajittelee sille annetun syötteen, eli tässä tapauksessa <tt>du</tt>:n tulosteen, numeerisesti (valitsin <tt>-n</tt>) isoimmasta pienimpään (valitsin <tt>-r</tt> kääntää tulostusjärjestyksen, joka oletuksena olisi pienimmästä isoimpaan). Lopuksi käytetään komentoa <tt>[[head]] -5</tt> näyttämään <tt>sort</tt>in tulostuksesta vain viisi ensimmäistä riviä.  


Toiminnallisesti sama tulos tulee myös komennolla
Toiminnallisesti sama tulos tulee myös komennolla
Rivi 194: Rivi 198:
  23281  /etc
  23281  /etc


Tässä taas grepille on annettu valitsin -v, jolla määritellään grep näyttämään rivit, joihin ei sisälly annettua merkkijonoa X11.
Tässä taas <tt>grep</tt>ille on annettu valitsin <tt>-v</tt>, jolla määritellään <tt>grep</tt> näyttämään rivit, joihin ei sisälly annettua merkkijonoa X11.


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


Tämä puolestaan kertoo, kuinka monta tiedostoa on hakemistossa /etc ([[wc]] -l laskee syötteen rivit). Luku ei ole tarkka, koska mukaan laskettiin myös otsikkorivi.
Tämä puolestaan kertoo, kuinka monta tiedostoa on hakemistossa <tt>/etc</tt> (<tt>[[wc]] -l</tt> laskee syötteen rivit). Luku ei ole tarkka, koska mukaan laskettiin myös otsikkorivi.
 
''Vinkki'': <tt>du</tt>:n tulosteessa hakemistojen koot ilmoitetaan tavuina. Se onkin hyvä, jos hakemistojen kokoja halutaan vertailla keskenään kuten yllä. <tt>du</tt>:n saa tulostamaan myös hakemistojen koot ihmiselle luettavassa muodossa käyttäen kilo-, mega- ja gigatavuja valitsimella <tt>-h</tt>. Tällöin hakemistojen kokojen vertailu <tt>sort</tt>illa ei onnistu, sillä se ei tajua, että 1M on enemmän kuin 10k.
 


== Komentojen ketjutus ==
== 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 [[Gentoo|Gentoon]] [[paketinhallinta|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:
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 [[Gentoo|Gentoon]] [[paketinhallinta|paketinhallinnan]] tietokanta voidaan päivittää komennolla <tt>[[emerge]] --sync</tt> ja tämän jälkeen päivittää koko järjestelmä komennolla <tt>emerge -uDNav world</tt>. Nämä voidaan yhdistää seuraavalla tavalla:
  # emerge --sync && emerge -uDNav world
  # 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.
Joka ensin päivittää tietokannan eli ajaa komennon <tt>emerge --sync</tt>. Mikäli se ei palauta virhettä, ajetaan jälkimmäinen päivityskomento.


Toisaalta ||-ohjausmerkki toimii päinvaston: jälkimmäinen komento suoritetaan vain mikäli edellinen epäonnistuu, vertaa esimerkiksi:
Toisaalta ||-ohjausmerkki toimii päinvastoin: jälkimmäinen komento suoritetaan vain mikäli edellinen epäonnistuu, vertaa esimerkiksi:
  $ false || cowsay tämä näkyy koska false palauttaa virheen
  $ [[false]] || cowsay tämä näkyy koska false palauttaa virheen
  $ true || cowsay tämä ei näy koska true palauttaa onnistumisen
  $ [[true]] || cowsay tämä ei näy koska true palauttaa onnistumisen


Komentoja voidaan yhdistellä myös puolipisteellä (;), jolloin minkäänlaista tarkistusta komennon onnistumisesta ei suoriteta. Esimerkiksi seuraavien komentojen tulosteet ovat identtiset
Komentoja voidaan yhdistellä myös puolipisteellä (;), jolloin minkäänlaista tarkistusta komennon onnistumisesta ei suoriteta. Esimerkiksi seuraavien komentojen tulosteet ovat identtiset
Rivi 215: Rivi 222:


==Komentojen käynnistäminen taustalle==
==Komentojen käynnistäminen taustalle==
'' Katso myös artikkeli [[Tausta-ajo#Prosessien_tausta-ajo]]''
Voit käynnistää komennon pyörimään taustalle laittamalla &-merkin komennon perään. Esimerkki:
Voit käynnistää komennon pyörimään taustalle laittamalla &-merkin komennon perään. Esimerkki:
  $ [[xterm]] &
  $ [[xterm]] &
Rivi 249: Rivi 258:
  $ [[echo]] $([[uname]]) >appelsiini
  $ [[echo]] $([[uname]]) >appelsiini


Lainausmerkkejä voi käyttää sisäkkäin, vaikka tässä joutuukin helposti pitämään kielen keskellä suuta. Tyypillinen käyttö on komennon tulosteen saaminen tiedostonimeen tai päinvastoin, suojaten rakennelmaa erikoismerkeiltä (välilyönti tms.). Seuraava komento luo ympäristömuuttujassa $arkisto määrätystä työhakemiston alihakemistosta tar-version, joka päivätään arkiston ChangeLog-tiedoston mukaan. Ympäristömuuttujan nimen voi halutessaan erottaa aaltosuluilla.
Lainausmerkkejä voi käyttää sisäkkäin, vaikka tässä joutuukin helposti pitämään kielen keskellä suuta. Tyypillinen käyttö on komennon tulosteen saaminen tiedostonimeen tai päinvastoin, suojaten rakennelmaa erikoismerkeiltä (välilyönti tms.). Seuraava komento luo ympäristömuuttujassa $arkisto määrätystä työhakemiston alihakemistosta tar-version, joka päivätään arkiston <tt>ChangeLog</tt>-tiedoston mukaan. Ympäristömuuttujan nimen voi halutessaan erottaa aaltosuluilla.
  $ arkisto="mikälie"
  $ arkisto="mikälie"
  $ tar cf "${arkisto}_$(date -r ${arkisto}/ChangeLog --rfc-3339=date).tar" "${arkisto}/"
  $ tar cf "${arkisto}_$(date -r ${arkisto}/ChangeLog --rfc-3339=date).tar" "${arkisto}/"
Rivi 262: Rivi 271:
  [jaakko@laptop] ~ % cat /var/log/crond
  [jaakko@laptop] ~ % cat /var/log/crond
  bck-i-search: cat _
  bck-i-search: cat _
Jotta komentohistoria ei tuhoutuisi komentotulkki-istunnon sulkemisen yhteydessä, tallentavat useimmat komentotulkit sen sisällön tiettyyn tiedostoon. Yleensä tallennus tapahtuu vasta komentotulkin sulkeutuessa, mutta osa komentotulkeista on myös mahdollista säätää tekemään tallennus heti komennon antamisen jälkeen. Bashissa käytetään yleensä komentohistoriatiedostona tiedostoa ~/.bash_history. Myös tiedosto ~/.history on yleinen.
Jotta komentohistoria ei tuhoutuisi komentotulkki-istunnon sulkemisen yhteydessä, tallentavat useimmat komentotulkit sen sisällön tiettyyn tiedostoon. Yleensä tallennus tapahtuu vasta komentotulkin sulkeutuessa, mutta osa komentotulkeista on myös mahdollista säätää tekemään tallennus heti komennon antamisen jälkeen. Bashissa käytetään yleensä komentohistoriatiedostona tiedostoa <tt>~/.bash_history</tt>. Myös tiedosto <tt>~/.history</tt> on yleinen.


Komentohistoria (nykyinen historia + komentohistoriatiedosto) on mahdollista tulostaa ruudulle komennolla <tt>history</tt>. Tietyn komentohistorian rivin voi suorittaa uudelleen komennolla !<rivinumero>, esimerkiksi
Komentohistoria (nykyinen historia + komentohistoriatiedosto) on mahdollista tulostaa ruudulle komennolla <tt>history</tt>. Tietyn komentohistorian rivin voi suorittaa uudelleen komennolla !<rivinumero>, esimerkiksi
Rivi 319: Rivi 328:
Komentorivin toimintaan voi vaikuttaa muokkaamalla komentotulkin [[asetustiedosto]]ja. Yleisin komentotulkin asetustiedoston muoto on suoritettava komentojono (vrt. [[MS-DOS|DOSin]] autoexec.bat) joka toimii pitkälti kuten tavallinen komentotulkkiskripti. Tällaiseen tiedostoon lisätyt komennot ajetaan aina esimerkiksi komentotulkin käynnistyessä.  
Komentorivin toimintaan voi vaikuttaa muokkaamalla komentotulkin [[asetustiedosto]]ja. Yleisin komentotulkin asetustiedoston muoto on suoritettava komentojono (vrt. [[MS-DOS|DOSin]] autoexec.bat) joka toimii pitkälti kuten tavallinen komentotulkkiskripti. Tällaiseen tiedostoon lisätyt komennot ajetaan aina esimerkiksi komentotulkin käynnistyessä.  


Kuten muitakin asetustiedostoja, komentotulkin asetustiedostoja on yleensä kahdenlaisia, järjestelmänlaajuisia, /etc-hakemistossa sijaitsevia tiedostoja (esimerkiksi /etc/bashrc) sekä käyttäjäkohtaisia, käyttäjän kotihakemistossa sijaitsevia (piilo)tiedostoja (esimerkiksi ~/.bashrc). Järjestelmänlaajuinen asetustiedosto ajetaan yleensä ennen käyttäjäkohtaista, jolloin käyttäjälle jää "viimeinen sana" komentotulkkinsa asetuksiin.
Kuten muitakin asetustiedostoja, komentotulkin asetustiedostoja on yleensä kahdenlaisia, järjestelmänlaajuisia, /etc-hakemistossa sijaitsevia tiedostoja (esimerkiksi <tt>/etc/bashrc</tt>) sekä käyttäjäkohtaisia, käyttäjän kotihakemistossa sijaitsevia (piilo)tiedostoja (esimerkiksi <tt>~/.bashrc</tt>). Järjestelmänlaajuinen asetustiedosto ajetaan yleensä ennen käyttäjäkohtaista, jolloin käyttäjälle jää "viimeinen sana" komentotulkkinsa asetuksiin.


Bashin toimintaan vaikuttavat asetustiedostot ovat:
Bashin toimintaan vaikuttavat asetustiedostot ovat:
*/etc/profile ja ~/.profile - järjestelmän laajuinen komentojono, joka ajetaan kaikkien kirjautumiskomentotulkki-istuntojen aluksi. Kirjautumiskomentotulkilla tarkoitetaan istuntoa, johon käyttäjä on siirtynyt tekstipohjaisen kirjautumisen jälkeen.
*<tt>/etc/profile</tt> ja <tt>~/.profile</tt> - järjestelmän laajuinen komentojono, joka ajetaan kaikkien kirjautumiskomentotulkki-istuntojen aluksi. Kirjautumiskomentotulkilla tarkoitetaan istuntoa, johon käyttäjä on siirtynyt tekstipohjaisen kirjautumisen jälkeen.
*/etc/[[bash_profile]] ja ~/bash_profile - Bashin oma profile-tiedosto.
*<tt>/etc/[[bash_profile]]</tt> ja <tt>~/bash_profile</tt> - Bashin oma profile-tiedosto.
*/etc/[[bashrc]] ja ~/.bashrc - Ajetaan kaikkien interaktiivisten komentotulkki-istuntojen aluksi, eli aina, kun Bash käynnistetään jotain muuta kuin skriptin ajamista varten. Ylivoimaisesti käytetyin komentojonotiedosto.
*<tt>/etc/[[bashrc]]</tt> ja <tt>~/.bashrc</tt> - Ajetaan kaikkien interaktiivisten komentotulkki-istuntojen aluksi, eli aina, kun Bash käynnistetään jotain muuta kuin skriptin ajamista varten. Ylivoimaisesti käytetyin komentojonotiedosto.
*/etc/[[bash_logout]] ja ~/.bash_logout - Bashin sulkemisen yhteydessä ajettava komentojono
*<tt>/etc/[[bash_logout]]</tt> ja <tt>~/.bash_logout</tt> - Bashin sulkemisen yhteydessä ajettava komentojono
*/etc/[[inputrc]] ja ~/.inputrc - Bashin komentorivieditoinnista huolehtivan [[readline]]-[[kirjasto]]n asetustiedosto
*<tt>/etc/[[inputrc]]</tt> ja <tt>~/.inputrc</tt> - Bashin komentorivieditoinnista huolehtivan [[readline]]-[[kirjasto]]n asetustiedosto


Zsh-komentotulkin asetustiedostoja on selitetty laajasti artikkelissa [[Zsh]].
Zsh-komentotulkin asetustiedostoja on selitetty laajasti artikkelissa [[Zsh]].

Navigointivalikko