Bashi kasutamine

Allikas: Kuutõrvaja

Sissejuhatus

Enamasti on Linuxi masinad niimoodi seatud, et peale sisselogimist on ees ainult viip või vähemalt üks automaatselt avanenud akendest on viibaga aken.

Viip võib olla kaunis erineva välimusega; tema välimust saab kasutaja ise muuta. Näiteks kasutaja priit viip kusjuures töökataloog on /home/priit/public_html ehk lühidalt ~/public_html

bash~/public_html$

tilde (~) märgib kasutaja kodukataloogi, antud juhul /home/priit

Järgnevalt on toodud juurkasutaja viip, mille tunneb ära trelli (#) järgi

bash#

Kursor on viiba taga. Kui sisestada midagi klaviatuurilt, ilmub tekst viibast paremale.

Viip ja kursor selle järel on kasutaja kooriku (tuntud ka karbi ja shelli nime all) nö. veepealne osa.

Koorik on esimene programm, mis käivitatakse peale kasutaja sisselogimist selle kasutaja õigustes ning mis tavaliselt töötab kuni kasutaja väljumiseni süsteemist. Kasutaja poolt sisestatuga tegeleb koorik ise või kutsub välja sobiva programmi.

Peale kooriku Bash on olemas C-koorik, koorik Korn ning palju teisi. Käesolev puudutab vaid koorikut Bash, kuigi suurelt jaolt kehtib öeldu ka muude koorikute kohta.

Koorikut kasutades on lisaks üksikutele klahvidele vaja sageli kasutada nende kombinatsioone.

Näiteks Ctrl+C tähendab 'Ctrl' ja 'C' kombinatsiooni. Kombinatsiooni valimiseks tuleb 'Ctrl' klahv vajutada alla varem ning vabastada hiljem kui C-tähe klahv.

Proovige sisestada käsurealt Ctrl+x ja Ctrl+v. Tulemusena näete, oma kooriku versiooni

bash-2.03$ Ctrl+x, Ctrl+v
GNU bash, version 2.03.0(1)-release (i386-slackware-linux-gnu)

Lisaks proovige midagi sellist:

  1. . Kirjutage viiba taha kaks üksteisest tühikuga eraldatud sõna
  2. . Sisestage Alt+t

Tulemusena muudetakse sõnade järjekord.

Programmi käivitamine

Kooriku üks peamisi ülesandeid on anda kasutajale võimalus programme käivitada.

Koorik lihtsustab tee peal (st. keskkonnamuutuja PATH poolt näidatud kataloogides) olevate programminimede ja sisekäskude (ingl. k. built-in) kirjutamist sel moel, et piisab kirjutada vaid programmi nimi, st ilma teeta.

  • Koorikusse võib kirjutada programminime koos teega
     bash~$ /usr/bin/pine
  • Kuid võib ka ilma, eeldusel, et /usr/bin on tee peal
     bash~$ pine
  • Tihti jääb kasutaja nõutuks, kuna ei saa vastloodud programmi või skripti käivitada. Üks põhjus võib olla selles, et töökataloog puudub teelt. Siis tuleb näidata eraldi, et käivitada käesolevas kataloogis asuv fail
     bash~$ ./minu.skript.pl

Koorikus saab anda ühe rea peal ka mitu korraldust, kui nad eraldada semikooloniga, näiteks

bash~$ clear; ls -l; date

Mõnel juhul on otstarbekas eraldada käsud märkidega '&&'. Nt. kerneli kompileerimisel:

bash~$ make dep && make clean && make bzImage

Märkidele '&&' järgnev käsk täidetakse ainult juhul, kui eelmise täitmine lõppes edukalt.

Kui soovite käivitada programmi või skripti (va kooriku skripti) nii, et ta saaks endale kooriku PIDi, siis sisestage programmi nimi käsu exec (ingl. k. vii täide) järgi:

bash~$ exec pine

Ärge imestage, kui te peale programmi töö lõppu viibast ilma olete, sest Pine kävitamisel lakkab koorik olemast kuna koorik asendati Pine'ga. Kui tavaliselt kävitatud Pine'i töö lõpetamisel antakse kasutajale ette tagasi viip, siis nüüd pole midagi anda.

Kooriku skripti puhul aga sisestage:

bash~$ . skriptinimi

Ilma punktita käivitatakse uus koorik ja täidetakse käsud seal. Punktiga alustades jätkatakse sama koorikuga. Peale skripti töö lõppu jääb teile viip alles. Punkti (.) asemele võib kirjutada ka käsu source.

Vahel võib tekkida vajadus sisestada viiba taha erisümboleid, mis omavad kooriku jaoks erilist tähendust. Näiteks

\  kurakald ehk tagurpidi kaldkriips
" jutumärk 
` graavis
/ kaldkriips
' ülakoma
~ tilde 
$ dollar
   tühik

Kui Teie aga soovite neid kasutada lihtsalt sümbolitena, siis tuleb erisümbolid põgeneda (ingl. k. escape), sisestades vahetult erisümboli ette kurakallu (\).

Näiteks ei õnnestu tekitada faili "$priidu.eri":

bash~$ touch $priidu.eri

kuna koorik tõlgendab Teie sisestust soovina tekitada fail, mille nimeks saab keskonnamuutuja priidu.eri väärtus ning eeldatavasti sellist keskkonnamuutujat ei ole. Siis saate veateate ja ei toimu midagi.

Küll aga on see võimalik selliselt

bash~$ touch \$priidu.eri

Failinimedes on soovitav vältida eesti keele täpitähti ja erisümboleid. UNIX eristab nii käsunimedes kui failinimedes suuri tähti vastavatest väikestest.

Põgemisest võib oluliselt abi olla sel juhul, kui te olete silmitsi kellegi failinimetamise häid tavasid mittejärgiva failiga ning ometi on Teil vajadus selle faili poole pöörduda.

Käsureal liikumine

Käsureal liikumise ja tekstisisestamise võtteid on kahesuguseid:

  • emacsi rezhiim (tavaliselt vaikimisi)
  • vi-rezhiim

Käesolevas kirjeldame toimetamist emacs'i rezhiimis.

Rezhiimi saab määrata, kui loote või redigeerite faili ~/.inputrc. Sinna tuleb sisestada kas

set editing-mode vi

või

set editing-mode emacs

Käsureale teksti sisestamisel on abiks teada

Ctrl-a: rea algusse
Ctrl-e: rea lõppu
Ctrl-f: täht edasi
Ctrl-b: täht tagasi
 Alt-f: sõna edasi
 Alt-b: sõna tagasi
Ctrl-l: puhasta ekraan
Ctrl-u: kustuta real olev tekst

Käsureal oleva teksti muutmine

Käsureale teksti sisestamisel on abiks teada

Ctrl-t: vaheta omavahel kursorist vasakule jäävad kaks sümbolit
Ctrl-d: kustuta sümbol kursori alt
 Alt-t: vaheta kursori lähedal olevad kaks sõna
 Alt-u: suurtähesta sõna (tuleb olla sõna ees)
 Alt-l: väiketähesta sõna
 Alt-c: suuralgusttähesta sõna

Käsu lõpetamine

Programmi nime kirjutamisel piisab sisestada mõned programmi nime algustähed ning vajutada seejärel tabulaatorit. Kui käsk on üheselt äratuntav, siis sisestus lõpetatakse teie eest; kui mitte, siis teistkordsel tabulaatori vajutusel näidatakse kõikvõimalikke valikuid. Sarnane on lugu käsu argumentideks olevate faili ja kataloogide nimedega: ka neid püütakse tabulaatori vajutamisel lõpetada või näidatakse kõikvõimalikke valikuid.

Järgnevates näidetes tähistab '<TAB>' tabulaatori vajutamise kohta.

  • Koorik lõpetab ise programminime ära:
     bash~$ netsc<TAB>

Eeldusel, et ainuke teel olev programm, mis algab tähtedega 'netsc' on 'netscape'. Vastasel korral saaks veelkordsel tabulaatorivajutusel näha kõikvõimalikke valikuid.

  • Sarnaselt toimib koorik ka failinimedele
     bash~$ vi west.side.sto<TAB>
  • Samuti keskonnamuutujate puhul
     bash~$ echo $OSTY<TAB>

Käsurea väärtustamine

Pea kõik järgnev taotleb sisestuse lühidust ja üldisust. Sulgudest järgi kordamine

(brace expansion)

Konstruktisoon a{1,2,3,4,5_fail} asendub käsu täitmisel viie elemendiga: a1_fail, a2_fail jne.

bash~$ mkdir a{1,2,3,4,5}_fail
bash~$ ls
a1_fail
a2_fail
a3_fail
a4_fail
a5_fail

Käsu mkdir'i asemel saab ka teisi korraldusi kasutada.

Muutuja väärtustamine

(parameter and variable expansion)

Võimadab kasutada käsureal keskkonnamuutujate väärtusi.

bash~$ echo ${OSTYPE} on hää Linux on hää

kusjuures erijuhuks on tilde väärtustamine, kus arvestatakse, et ~ on sama väärtusega, mis $HOME:

bash~$ echo ~/tere
/home/imre/tere

Käsu väärtustamine

(command substitution)

Asendab käsu nime selle täitmisel saadud väljundiga

bash~$ sysvbanner `whoami`
bash~$ echo $(ls)
a1_fail a2_fail a3_fail a4_fail a5_fail

Aritmeetiline väärtustamine

(arithmetic expansion)

Võimaldab teha tehteid keskkonnamuutujate väärtustega.

bash~$ export MUUTUJA = 4
bash~$ echo $((1+2*$MUUTUJA))
9
bash~$ echo $[1+2*$MUUTUJA]
9

Mallid

(pahtname expansion)

Mallide kasutamine võimaldab pöörduda mitmete sama tunnust omavate failinime kandvate failide poole ühekorraga. Osalt on mallid sarnased regulaaravaldistega.

kuvame kõik failid kataloogis rekursiivselt, st põhjani välja

bash~$ ls *
mina1
mina1c
mina2
mina2c
mina3
mina3c
mina4
mina5

kuvame vaid teatud tingimusele vastavate nimedege failid:

bash~$ ls -l mina[2-4]*
mina2
mina2c
mina3
mina3c
mina4 
bash~$ ls -l mina?c
mina1c
mina2c
mina3c

Ajalugu

Koorik 'mäletab' talle antud käske. Vaikimisi peetakse meeles 500 viimast käsku ning nad on kirjas failis ~/.bash_history. Varem sisestatud käsku saab uuesti kasutada liikudes klaviatuuri noole klahvidega mööda ajalugu; kui sobiv käsk ilmub, siis vajutage Enterit. Kui te aga soovite kuvada nt viit viimast ajalukku salvestatud käsku, sisestage:

bash~$ history 5
  309  date
  310  whoami
  311  cal
  312  df
  313  history 5

Ning soovides käivitada taas tagantpoolt 100'ndat eeldusel, et niipalju käske on antud, sisestage:

bash~$ !100

noglob, noclobber, ignoreeof

Tavaliselt on vaikimise need nii seatud, et

  • *, ?, ~ on metasümbolid,
  • faili kirjutatakse üle,
  • kümnes järjestikuline Ctrl+d logib teid välja.

Vaatleme, kuidas neid määranguid saab muuta.

Seda, kas koorik käsitleb *, ? ja ~ metasümbolitena või mitte, saab määrata korraldusega:

bash~$ set +o noglob (seejärel käsitletakse *, ?, ~ metasümbolitena) 
bash~$ set -o noglob (seejärel käsitletakse *, ?, ~ tavaliste failinimedes esineda 
                    võivate tähemärkidena)

Standardväljundi ümbersuunamisel kasutatakse sellist konstruktsiooni:

bash~$ ls > listing

Kui fail listing on olemas, siis kirjutatakse tema sisu hoiatamata üle. Sellises olukorras saab kooriku hoiatama panna korraldusega:

bash~$ set -o noclobber (ei kirjutata üle ja antakse veateade)
bash~$ set +o noclobber (kirjutab üle)

Mõnikord on väga ebamugav, kui Teid kümne järjestikulise 'Ctrl-d' järel välja logitakse. Seda saab muuta nii

bash~$ set -o ignoreeof  (ei logi välja)
bash~$ set +o ignoreeof  (logib välja)

alias

Kasutajal on võimalik lisada olemasolevatele kooriku sisekäskudele käske, mida nimetatakse aliasteks. Tavaliselt täidab alias teatud järgnevuse olemasolevaid programme või teisi sisekäske. Näiteks tekitame aliase mitu, mis näitab kui palju on parasjagu süsteemis kasutajaid

bash~$ alias mitu='echo Süsteemis on `who | wc -l` kasutajat'
bash~$ mitu
Süsteemis on 15 kasutajat

Aliased on kasutatavad, kuni vastav koorik on olemas. Kooriku lõppemisel, nt väljalogimisel, aliased kaovad.

Et aliased oleks peale kooriku käivitamist koheselt tarvitatavad, tuleb nad defineerida kooriku initsialiseerimisfailides, vt järgmist punkti.

Aliastes on võimalik ka kasutada käsu argumente. Näiteks tekitame aliase mis saadab näidatud aadressil e-kirja

bash~$ alias sp='cat spamm | mail $1'

Sellise aliase kasutamine toimub selliselt

bash~$ sp mart

Kui soovite näha parasjagu aktiivseid aliaseid andke käsk alias.

Soovides defineeritud aliast eemaldada andke käsk unalias, näiteks

bash~$ unalias mitu

Sisse-ja väljalogimise skriptid

Kui kasutaja koorikuks on määratletud Bash, siis peale kasutaja sisselogimist täidetakse esmalt failis /etc/profile sisalduvad korraldused ning seejärel need, mis on kasutaja failides ~/.bash_login ja ~/.profile

Nagu eespool mainitud, defineeritakse ühes neist enamasti aliased ja tee (PATH keskkonnamuutuja sisu). Nt soovib kasutaja tee peale panna kataloogi ~/bin ja parasjagu käesoleva kataloogi ning defineerida käsu kell, mis näitab aega

bash~$ cat ~/.bash_login
export PATH="$PATH:~/bin:."
alias kell="date | cut -d \" \" -f 5"

Võimalik on muuda veel paljusid keskkonnamuutujaid näiteks vaikimisi seadistatud editori

EDITOR=nano

Charseti muutmiseks ja näiteks täpitähtede kasutamiseks shellis ja käivitavates programmides piisab kui lisada reead

LANG=en_US.UTF-8 

Selleks ,et ka less käsk näitkaks teksti utf-8 formaadis tuleb lisada

LESSCHARSET=utf-8

Nagu juba eelpoolmainitud siis aliaste kirjeldamine käib lihtsalt kujul

alias käsk='mingi tegevus'

Bashi värviliseks muutmiseks

export CLICOLOR=1

Kasutaja võib luua oma kodukataloogi faili ~/.bash_logout. Selles sisalduvad käsud täidetakse peale kasutaja väljalogimist.

Tüüpiline on viimasesse kirjutada vähemalt üks rida:

clear

mis puhastab ekraani.

Eripäraseks võimaluseks on käivitada koorikust uus koorik

bash~$ bash

Sel juhul ei loeta mainitud faile läbi, kuna need käivad sisselogimise kohta. Küll aga võib kasutaja tekitada faili ~/.bashrc, mille sisu täidetakse igakordsel kooriku käivitamisel.

Bashi profiili võib kirjutada aliaste asemel ka funktsioone, näiteks failide seest otsingu hõlbustuseks

function otsi () { grep -r "$*" *; }

Kasutamiseks trükkida bashi promti käsk otsi tekst mille peale otsitakse jooksva kausta kõikidest failidest vastavat rida

Kooriku töökontroll

Operatsioonisüsteem peab arvet kõigi käivitatud programmide (protsesside) üle. Ka iga koorik peab arvet sealt käivitatud programmide üle. Koorik võimaldab programme:

  • käivitada
  • peatada
  • jätkata
  • lõpetada

Peatamine erineb lõpetamisest selle poolest, et peatatud programmide tööd saab hiljem jätkata; lõpetatud töö on jäädavalt lõpetatud. Kooriku vahenditega ei saa muuta protsesside prioriteete. Programmi käivitamine ja peatamine.

Kõiki programme ei ole võimalik koorikus peatada. Kasutame kummalist programmi 'yes', mis kirjutab oma standardväljundisse oma nime. Kuna ta teeb seda väga vilkalt, siis ei ole mõistlik väljundit ekraanile ega tavalisse faili suunata; suuname ta seadmesse /dev/null.

bash~$ yes > /dev/null            # käivitamine, pange tähele, et
                                  # et viip on blokeeritud
                                  # yes töötab esiplaanil
Ctrl + Z                          # peatamine
[1]+ Stopped yes > /dev/null
bash~$ jobs 			  # kuvame kooriku tööd
[1]+ Stopped yes > /dev/null
bash~$

Peatatud programmi töö jätkamine esiplaanil või taustal

Peamine erinevus programmi esiplaanil (in. k. foreground) või taustal (in. k. background) töötamise vahel seisneb selles, et esiplaanil töötava programmi puhul on viip kasutaja jaoks blokeeritud.

bash~$ bg %1                       # esimene kooriku töö jätkab taustal, 

# viip saab vabaks

bash~$ jobs
[1]+ Running  yes > /dev/null
bash~$ fg %1                       # taustal töötava programmi

# esiplaanile toomine

Programmi töö lõpetamine.

Kui programm töötab esiplaanil, siis piisab tema lõpetamiseks valida Ctrl+C.

Taustal töötava programmi töö lõpetamiseks kasutatakse käsku kill

bash~$ kill %1

Arusaadavalt võib manipuleerida rohkem kui ühe programmiga ja nende poole pöördutakse %järjekorra.number abil.

Kui soovite programmi käivitada taustal, lõpetage käsurida ampersandiga

bash~$ yes > /dev/null &

Prompt

Järgnev puudutab peaasjalikult seda kuidas saab muuta Bashi'i prompti kuju sh. värvi.

Niisiis, prompton see, mille taha te käske annate:

bash $

Prompti määravad read asuvad shell scriptis keeles /etc/profiles. See on fail mille käsud peale kasutaja sisselogimist täidetakse. Seal on olulisi asju teisigi aga hetkel konsentreerume keskkonnamuutjale PS1. See määrabki prompti kuju. Kui seda muutujat muuta siis muutub prompt. Proovige muutujat muuta kohe otse käsurealt; ka kui tahate, et seda alati peale sisselogimist tehtaks siis kirjutage ise oma ~/.profile fail. See täidetakse peale sisselogimist peale /etc/profile't.

Nii, katsetame:

bash$ export PS1="tere % "
tere %

ja nii see muutubki!

Aga nii lihtsalt tehes on prompt väga staatiline. Tavaliselt on promptil kirjas nt. kuupäev, või masina nimi või kasutaja nimi ams. Proovime.

bash# export PS1="`whoami`@`hostname -f`: `pwd` ;=| " 
root@ut.ee: /usr/local/games/quake2 ;=|

Nii see käib.

Aga kuivõrd tihti on vaja just mõnda infot panna prompti siis on kavalab mehed bash'i kombineerinud sisse hulka asju:

   \t     the current time in HH:MM:SS format
   \d     the date  in  "Weekday  Month  Date"  format (e.g.,"Tue May 26")
   \n    newline
   \s    the  name  of  the shell, the basename of $0
   \w    the current working directory
   \W    the basename of the current  working  directory
   \u    the username of the current user
   \h    the hostname
   \#    the command number of this command
   \!    the history number of this command
   \$    if  the effective UID is 0, a #, otherwise a $
   \nnn   the character  corresponding  to  the  octal number nnn
   \\    a backslash
   \[    begin a sequence of non-printing characters, which could be used to embed a terminal control sequence into the prompt
   \]    end a sequence of non-printing characters

Näiteks:

bash: # export PS1='\h:\w\$ '
ut:/usr/local/games/quake2#

Nagu ikka shell scriptides on ka siin kolm erinevat "ülakoma"

` 
' 
" 

ja neil vahet teha on oluline!

Escape Sequences

Enamus terinale on ju värvilised ja seda saab kasutada! Proovige:

bash # echo "^[[40;36;01mHello World^[[m"
Hello World

või

bash # echo '\033[40;36;01mHello World\033[m'
Hello World

Esimene juht on vist kindlam. Ainuke segadus seisneb selles, et kuidas neid nn. escape järgnevusi sisestada. Nii:

^[ 

tekitatakse vajutades

'Ctl - v' ja seejärel 'Esc' 

(hoiate all Control klahvi ja valjutate samal ajal v klahvi; lasete v lahti ja siis Controli, seejärel vajutate korraks Esc klahvi)

\033 on mõnes olukorras samaväärne ^[ -ga :) 

Niisiis, võiks kirja panna sümbooliselt asja nii:

bash # echo "Ctl-v ESC[40;36;01mHello WorldCtl-v ESC[m"
Hello World

ilmselt määratakse värvid 40;36;01 komonatsiooniga.

Neid escape koode võite pista nt. shell scriptidesse ja kuhu veel. Mis aga ehk huvitav, vaatame kuidas teha nii, et kasutaja 'root'prompt oleks nt. kollane!

bash# export PS1='\033[40;33;01m \h:\w\$\033[m ';

Lingid

http://wiki.archlinux.org/index.php/Color_Bash_Prompt