• Rezultati Niso Bili Najdeni

Kazalo IILinuxvukaznilupini bash 5

N/A
N/A
Protected

Academic year: 2022

Share "Kazalo IILinuxvukaznilupini bash 5"

Copied!
104
0
0

Celotno besedilo

(1)

Kazalo

II Linux v ukazni lupini bash 5

1 Ukazna lupina bash 7

1.1 Osnove . . . 7

1.1.1 Vrste lupin . . . 7

1.1.2 Ukazna lupina: bash . . . 9

1.1.3 Ukazna vrstica . . . 10

1.1.4 Zgodovina vnosov: history . . . 13

1.1.5 Zakljuˇcek dela: logout . . . 13

1.2 Uporaba ukazov . . . 14

1.2.1 Izpis: echo inprintf . . . 14

1.2.2 Vgrajeni in zunanji ukazi . . . 15

1.2.3 Tip ukaza: type. . . 16

1.2.4 Iskanje programa ukaza: which . . . 17

1.3 Pomoˇc pri uporabi ukazov . . . 18

1.3.1 Vgrajena pomoˇc . . . 18

1.3.2 Priroˇcnik: man. . . 18

2 Skriptni jezik bash 19 2.1 Pisanje skript . . . 19

2.1.1 Zgradba skripte . . . 19

2.1.2 Zagon skripte . . . 20

2.1.3 Okolje skripte . . . 20

2.1.4 Konˇcanje skripte: exit . . . 21

2.2 Sestavljanje ukazov . . . 22

2.2.1 Zaporedno izvajanje . . . 22

2.2.2 Pogojno izvajanje . . . 22

2.2.3 Zdruˇzevanje ukazov . . . 23 1

(2)

2.2.4 Izvajanje v podlupini . . . 24

2.3 Spremenljivke . . . 26

2.3.1 Definicija spremenljivk . . . 26

2.3.2 Uporaba spremenljivk . . . 27

2.3.3 Branje standardnega vhoda: read . . . 30

2.3.4 Vgrajene spremenljivke . . . 31

2.3.5 Prednastavljene spremenljivke . . . 32

2.3.6 Uporaba narekovajev . . . 32

2.4 Pogojni izrazi . . . 33

2.4.1 Primerjanje nizov . . . 33

2.4.2 Aritmetiˇcne primerjave . . . 34

2.4.3 Preverjanje datotek . . . 34

2.5 Programski stavki . . . 35

2.5.1 Zanke . . . 35

2.5.2 Odloˇcitveni stavki . . . 37

2.5.3 Funkcije . . . 38

2.6 Preusmerjanje . . . 39

2.6.1 Standardni vhod in izhod . . . 39

2.6.2 Preusmerjanje standardnega vhoda in izhoda . . . 40

2.6.3 Cevovod . . . 41

2.6.4 Sploˇsno preusmerjanje . . . 42

2.6.5 Preusmerjanje vhoda lupine . . . 44

3 Uporabniki 47 3.1 Osnovno delo . . . 47

3.1.1 Uporabniˇski raˇcuni . . . 47

3.1.2 Nastavitev gesla: passwd . . . 49

3.1.3 Pregled prijav: whoami, users, whoin w . . . 49

3.1.4 Zgodovina prijav: last in lastb . . . 51

3.1.5 Poizvedba po uporabniku: finger. . . 51

3.1.6 Zamenjava uporabnika: su insudo . . . 52

3.1.7 Spisek uporabnikovih skupin: groups . . . 52

3.1.8 Informacije o uporabniku: id . . . 53

3.1.9 Zamenjava skupine: newgrp and sg . . . 53

3.2 Administracija . . . 53

3.2.1 Uporabniˇski raˇcuni . . . 53

3.2.2 Ustvarjanje uporabnika: useradd . . . 54

(3)

3.2.3 Odstranjevanje uporabnika: userdel . . . 55

3.2.4 Spreminjanje uporabnika: usermod . . . 56

3.2.5 Kriptiranje gesla: mkpasswd . . . 56

3.2.6 Uporabniˇske skupine . . . 56

3.2.7 Nastavitev gesla: gpasswd . . . 57

3.2.8 Ustvarjanje skupine: groupadd . . . 57

3.2.9 Odstranjevanje skupine: groupdel . . . 57

3.2.10 Spreminjanje skupine: groupmod . . . 57

4 Datoteˇcni sistem 59 4.1 Logiˇcna organizacija podatkov . . . 59

4.1.1 Datoteke in imeniki . . . 59

4.1.2 Izpis vsebine imenika: ls . . . 62

4.1.3 Izpis strukture imenikov: tree. . . 64

4.1.4 Izpis in izbira delovnega imenika: pwd incd . . . 64

4.1.5 Ustvarjanje in odstranjevanje imenika: mkdir in rmdir . . . 65

4.1.6 Kopiranje, preimenovanje in odstranjevanje datoteke: cp, mv in rm . . . 66

4.1.7 Obdelava imena datoteke: basename indirname . 67 4.1.8 Nastavitev datuma datoteke: touch . . . 67

4.2 Posebne datoteke . . . 68

4.2.1 Tip in vrsta datoteke . . . 68

4.2.2 Izpis tipa in vrste datoteke: file . . . 69

4.2.3 Simboliˇcne in trde povezave . . . 69

4.2.4 Ustvarjanje in branje povezave: ln in readlink . 70 4.2.5 Informacije o datoteki: stat . . . 70

4.3 Zaˇsˇcita uporabe datotek . . . 71

4.3.1 Dovoljenja in sklopi uporabnikov . . . 71

4.3.2 Nastavitev lastnika in skupine datoteke: chown in chgrp . . . 72

4.3.3 Nastavitev dovoljenj uporabe datoteke: chmod . . 73

4.3.4 Nastavitev privzetih dovoljenj: umask . . . 75

5 Obdelava vsebine datotek 77 5.1 Kodiranje datotek . . . 77

5.1.1 Kodiranje ASCII . . . 78

(4)

5.1.2 Unikod . . . 79

5.1.3 Tekstovne datoteke . . . 79

5.2 Pregled in urejanje vsebine datotek . . . 80

5.2.1 Izpis vsebine datoteke: cat. . . 80

5.2.2 Pregled vsebine datoteke: morein less . . . 82

5.2.3 Izpis dela datoteke: headin tail . . . 83

5.2.4 Programerski izpis: od in hexdump. . . 84

5.2.5 Urejanje vsebine: vi oz. vim . . . 85

5.3 Obdelava vsebine datotek . . . 90

5.3.1 Urejanje po vrsticah: sort . . . 90

5.3.2 Permutiranje vrstic: shuf . . . 91

5.3.3 Odstranjevanje duplikatov: uniq . . . 91

5.3.4 Oˇstevilˇcenje vrstic: nl . . . 92

5.3.5 Obrat vrstic: rev . . . 93

5.3.6 Spreminjanje znakov: tr . . . 93

5.3.7 Obdelava po stolpcih: cut inpaste . . . 94

5.3.8 Delitev datoteke: split . . . 95

5.4 Analiza vsebine datotek . . . 95

5.4.1 ˇStetje znakov, besed in vrstic: wc . . . 95

5.4.2 Primerjava vsebine datotek: cmp. . . 96

5.5 Napredna obdelava vsebine . . . 97

5.5.1 Regularni izrazi . . . 97

5.5.2 Iskanje po vsebini: grep . . . 101

5.5.3 Preoblikovanje toka podakov: sed . . . 102

(5)

Del II

Linux v ukazni lupini bash

5

(6)
(7)

Poglavje 1

Ukazna lupina bash

1.1 Osnove

1.1.1 Vrste lupin

Lupina je program, ki uporabniku omogoˇca osnovno delo z raˇcunalnikom.

Uporabnik z lupino komunicira preko vhodno-izhodnih naprav kot so tip- kovnica, zaslon in miˇska. Delo navadno poteka interaktivno; uporabnik lupini poda ukaz, ta ga nato izvede, rezultat izvajanja pa se prikaˇze na zaslonu. Za dejansko izvedbo ukaza lupina uporabi usluge operacijskega sistema. Lupina torej predstavlja vmesnik med uporabnikom in operaci- jskim sistemom. Glede na naˇcin dela poznamo naslednji dve vrsti lupin:

• ukazne lupine,

• grafiˇcne lupine.

Z ukazno lupino uporabnik komunicira preko ukazne vrstice1. Vanjo uporabnik vnese ukaz in nato zahteva njegovo izvedbo. Po izgledu so ukazne lupine precej preproste, na zaslonu nudijo le prikaz teksta (nefor- matiranega besedila), miˇske pa navadno niti ne podpirajo. Kljub temu pa lahko veˇsˇc uporabnik ukazne lupine hitro in uˇcinkovito dela, saj mu ta navadno omogoˇca raznovrstne naˇcine medsebojnega sestavljanja ukazov.

Nemalo ukaznih lupin pravzaprav vsebuje celoten programski jezik.

1angl. command-line interface

7

(8)

Grafiˇcna lupina uporabniku nudi grafiˇcni uporabniˇski vmesnik2. Po izgledu so grafiˇcne lupine precej bolj sofisticirane kot ukazne lupine. Pod- pirajo tudi miˇsko, s katero uporabnik tudi najpogosteje podaja ukaze.

Kljub temu je marsikatero opravilo, ki je v ukazni lupini enostavno, v grafiˇcni lahko dokaj zapleteno ali celo nemogoˇce.

Praktiˇcno vsaka distribucija operacijskega sistema poleg samega jedra sistema vsebuje tudi neko lupino. Naˇstejmo nekaj bolj znanih lupin iz razliˇcnih operacijskih sistemov. Pregled zaˇcnimo z ukaznimi lupinami Unix operacijskih sistemov.

Bournova lupina sh. Ena izmed prvih ukaznih lupin, leta 1977 jo je razvilStephen Bourne. ˇSe danes se marsikje uporablja in je pogosto osnova za druge lupine.

C lupina csh. V poznih 1970-ih jo je razvilBill Joy (takrat ˇstudent), z namenom ˇcim veˇcje podobnosti s programskim jezikom C. Obstaja tudi njena nadgradnja, imenovana TENEX C lupina tcsh.

Kornova lupina ksh. V zaˇcetku 1980-ih jo je razvil David Korn. Je kompatibilna za nazaj s sh in vsebuje tudi mnogo znaˇcilnosti csh.

Bourne-Again lupina bash. Leta 1987 jo je naredil Brian Fox in je ena izmed najbolj pogosto uporabljanih lupin.

Z lupina zsh. Leta 1990 jo je razvil Paul Falstad. Vsebuje znaˇcilnosti bash,kshintcshter je ˇse posebej namenjena interaktivnemu delu.

Nadaljujmo z ukaznimi lupinami ne-Unix operacijskih sistemov.

DOS lupina command.com. Privzeta lupina operacijskih sistemov Mi- crosoft DOS in zaˇcetnih razliˇcic Microsoft Windows. Gre za zelo enostavno lupina, katere glavna funkcija je zagon programov in enostavno rokovanje z datotekami.

Windows lupina cmd.exe. Lupina v Microsoft Windows NT in sorod- nih operacijskih sistemih, med drugim tudi v IBM OS/2.

Nadomestki 4dos, 4nt in 4os2. Zaradi enostavnosti priloˇzene lupine command.com in cmd.exe so se pojavili njuni nadomestki.

2angl. graphical user interface

(9)

Windows PowerShell powershell.exe. Nastala je leta 2006 za Mi- crosoft Windows XP in novejˇse operacijske sisteme. Narejena je na Microsoft .NET platformi.

Spletna lupina goosh.org3. Lupina, ki teˇce v spletnem brskalniku, ra- zvita s strani podjetja Google in omogoˇca predvsem navigacijo po spletnih straneh.

Naˇstejmo ˇse nekaj grafiˇcnih lupin:

Program Manager progman.exe. Grafiˇcna lupina operacijskih siste- mov Windows 3.x.

Windows lupina explorer.exe. Lupina za Windows NT in sorodne sisteme, vsebuje namizno okolje, zaˇcetni meni, opravilno vrstico itd.

X Window System. Osnovno okensko okolje za grafiˇcne lupine v Unix sistemih.

GNOME. GNU Network Object Model Environment – grafiˇcno namizno okolje, ki teˇce na X Windows platformi.

KDE. K Desktop Environment – grafiˇcno namizno okolje, ki teˇce na X Windows platformi.

1.1.2 Ukazna lupina: bash

V tem besedilu bomo pozornost posvetili predvsem ukazni lupinibash, ki je bila zasnovana kot del projekta GNU4. Njena predhodnica je predvsem sh, poleg tega pa tudi csh ter ksh. Ime bash je okrajˇsava za ”Bourne–

again shell”5.

Lupina bash je verjetno ena najbolj pogosto uporabljanih lupin, saj je privzeta prijavna lupina veˇcine distribucij Linuxa in tudi nekaterih drugih operacijskih sistemov kot npr. Mac OS X. Prav tako jo je moˇzno namesti tudi v Microsoft Windows okolju.

3http://goosh.org

4http://www.gnu.org

5Gre za besedno igro z dvojnim pomenom: ”prerojena lupina” ali ”spet Bournova lupina” (spomnimo, da je Bourne avtor lupinesh).

(10)

V starejˇsih razliˇcicah Linuxa je bila ukazna lupina prvo, s ˇcimer se je sreˇcal uporabnik ob prijavi v sistem. Sedaj pa temu ni veˇc tako, saj se v veˇcini (ˇce ne kar v vseh) novejˇsih distribucijah Linuxa ob zagonu sistema najprej prikaˇze grafiˇcna lupina. ˇCe ˇzelimo uporabljati ukazno lupino, jo moramo posebej zagnati znotraj grafiˇce lupine. To navadno naredimo tako, da v zaˇcetnem meniju poiˇsˇcemo vnos ”Terminal”. Ustvari se tako imenovana psevdo konzola, znotraj katere teˇce lupina bash.

Program lupine bash se nahaja v izvrˇsljivi datoteki /bin/bash. V ukazni lupini ga lahko zaˇzenemo z:

bash [stikala] [datoteka]

Ce datoteke ne podamo, potem seˇ bash zaˇzene v interaktivnem naˇcinu, sicer pa v neinteraktivnem, pri ˇcemer zaˇcne z izvajanjem podane skriptne datoteke.

Oglejmo si ˇse nekaj zanimivejˇsih stikal, ki jih lahko uporabimo pri zagonu:

• -c ukaz . . . izvede podani ukaz,

• -i . . . delovanje v interaktivnem naˇcinu,

• -l . . . obnaˇsa se kot prijavna lupina.

1.1.3 Ukazna vrstica

Delo v lupini poteka preko ukazne vrstice, v katero vnaˇsamo ukaze. Na zaˇcetku ukazne vrstice se nahaja pozivnik6, katerega izgled je pogosto naslednji:

jure@ris:~>

⇂ Prikazani pozivnik je sestavljen iz veˇc delov; najprej je izpisano uporabni- ˇsko ime prijavljenega uporabnika, nato ime raˇcunalnika in na koncu ˇse trenutni delovni imenik lupine. Loˇcila med posameznimi deli pozivnika so znaki “@”, “:” in “>”. Iz zgornjega primera lahko razberemo, da je v sistem raˇcunalnika z imenom ris, prijavljen uporabnik jure, trenutni delovni imenik lupine pa je ~ (domaˇci imenik uporabnika).

Ukaz, ki ga ˇzelimo izvesti, vnesemo za znakom “>” in pritisnemo tipko Enter. V kolikor je z vneˇsenim ukazom kaj narobe, lupina to sporoˇci,

6angl. prompt

(11)

sicer pa ga izvrˇsi. Uporabimo ukaz za zamenjavo delovnega imenika, pri tem bodimo pozorni, kako se pozivnik spremeni:

jure@ris:~>cd Dokumenti ↿

jure@ris:~/Dokumenti>

Za urejanje ukazne vrstice uporabljamo alfanumeriˇcne tipke, smerne tipke, vraˇcalko7, brisalko8 in ˇse nekatere druge posebne tipke. Poleg roˇcnega urejanja nam je v pomoˇc tudi avtomatsko dopolnjevanje delno vneˇsene vrstice. V ukazno vrstico vnesemo le prvi del imena datoteke ali ukaza, s tipkoTabpa se vneˇseno ime delno ali v celoti dopolni. Z dvojnim pritiskom tipke pa dobimo seznam vseh moˇznih dopolnitev. Izvedbo ukazne vrstice zahtevamo s pritiskom tipke Enter.

Vsakiˇc, ko izvedemo ukazno vrstico, se njena vsebina shrani v seznam zgodovine vnosov ukaznih vrstic. S smernima tipkama gor in dol se lahko sprehajamo po tem seznamu. Uporabna je tudi kombinacija tipk Ctrl+R, ki omogoˇca hitro iskanje starega vnosa, pri ˇcemer v ukazno lupino vtipkamo le zaˇcetni del vnosa.

Ko v lupini izvedemo veˇc vrstic, se okno konzole slej kot prej za- polni. Pri izpisovanju dodatnih vrstic, se obstojeˇce vrstice pomaknejo navzgor, pri ˇcemer najviˇsje vrstice izginejo iz okna; v oknu je tako hkrati vidnih le zadnjih nekaj vrstic. Kljub izginotju lupina ˇse vedno hrani izginule vrstice. Okno konzole je pravzaprav le del neskonˇcnega traku na katerega poteka izpis vrstic. Pomik okna po traku nam omogoˇca tipka Shift s hkratnimi pritiskom tipke Up, Down, PageUp ali PageDown. ˇCe uporabljamo lupino v grafiˇcni konzoli, potem lahko okno pomikamo tudi z drsnikom v oknu.

S pomoˇcjo tipk je preko lupine omogoˇcen tudi enostaven nadzor nad trenutno izvajajoˇcim se ukazom. Tako Ctrl+C prekine izvajanje ukaza, Ctrl+Zpa zaustavi izvajanje (zaustavitev pomeni, da je moˇzno izvajanje kasneje nadaljevati). Pogosto nek program zahteva vnos podatkov, pri ˇcemer zahtevo za konec vnosa podamo s Ctrl+D, ki pravzaprav pred- stavlja navidezni znak za konec datoteke.

Zberimo pomembnejˇse kombinacije tipke v seznamu:

• Left aliCtrl+B – premik utripalke za eno mesto levo,

7angl. backspace

8angl. delete

(12)

• Right aliCtrl+F – premik utripalke za eno mesto desno,

• Home aliCtrl+A – skok utripalke na zaˇcetek ukazne vrstice,

• Endali Ctrl+E – skok utripalke na konec ukazne vrstice,

• Backspace aliCtrl+H – brisanje znaka levo od utripalke,

• Delete aliCtrl+D – brisanje znaka desno od utripalke,

• Ctrl+L – brisanje zaslona konzole,

• Ctrl+W – brisanje besede levo od utripalke,

• Ctrl+U – brisanje ukazne vrstice od zaˇcetka do utripalke,

• Ctrl+K – brisanje ukazne vrstice od utripalke do konca,

• Tab– avtomatsko dopolnjevanje,

• Tab Tab – seznam avtomatskih dopolnitev,

• Up ali Ctrl+P – priklic predhodne vrstice iz zgodovine vnosov,

• Down aliCtrl+N – priklic naslednje vrstice iz zgodovine vnosov,

• Ctrl+R – iskanje vrstice v zgodovini vnosov,

• Shift+Up – pomik po traku nazaj,

• Shift+Down – pomik po traku naprej,

• Shift+PageUp – pomik po traku za stran nazaj,

• Shift+PageDown – pomik po traku za stran naprej,

• Enter, Ctrl+J aliCtrl+M – izvajanje ukazne vrstice,

• Ctrl+D – navidezni znak za konec datoteke,

• Ctrl+C – ukinitev izvajanja trenutno izvajajoˇcega se programa,

• Ctrl+Z – prekinitev izvajanja trenutno izvajajoˇcega se programa,

• Ctrl+X Ctrl+V – izpiˇse razliˇcico lupinebash.

(13)

1.1.4 Zgodovina vnosov: history

Omenili smo, da lupina omogoˇca beleˇzenje zgodovine ukaznih vrstic.

Vsakiˇc, ko zahtevamo izvedbo ukazne vrstice, se njena vsebina shrani v seznam ukaznih vrstic. Izpis vsebine seznama in njegovo manipulacijo omogoˇca ukaz:

history [-crw] [-d st]

Ob zakljuˇcku lupine, se zgodovina shrani v datoteko ~/.bash history.

Oglejmo si ˇse nekaj zanimivejˇsih stikal, ki jih lahko uporabimo z ukazom:

• -c . . . brisanje celotne zgodovine vnosov,

• -d st. . . brisanje zapisa pod zaporedno ˇstevilko st,

• -r . . . preberi seznam iz datoteke zgodovine vnosov,

• -w . . . zapiˇsi seznam v datoteko zgodovine vnosov.

Primer izpisa seznama zgodovine vnosov:

jure@ris:~>history ↿

1 cd Documents/

2 ls -alp

3 cat podatki.txt | head -20 | sort | uniq -c

4 cd ..

1.1.5 Zakljuˇ cek dela: logout

Delo v ukazni lupini zakljuˇcimo z naslednjim ukazom:

logout

Ukaz izvede odjavo iz prijavne lupine. Opozorimo ˇse na to, da odjave iz podlupine ni mogoˇce narediti. Oglejmo si naslednji primer:

jure@ris:~>( logout ) ↿

bash: logout: not login shell: use ‘exit’

jure@ris:~>logout ⇃

Iz primera je razvidno, da v podlupini, namesto logoutuporabimo ukaz exit.

(14)

1.2 Uporaba ukazov

1.2.1 Izpis: echo in printf

Eno izmed najosnovnejˇsih programerskih opravil je prav gotovo izpis na zaslon. Obstaja veˇc razliˇcnih naˇcinov, kako to naredit v lupini. V ta namen si oglejmo dva ukaza: echo in printf. Pravzaprav oba ukaza navadno obstajata v dveh razliˇcicah: prva je v lupino vgrajeni ukazecho oz. printf, druga pa je zunanji ukaz /bin/echo oz. /usr/bin/printf.

Delovanje vgrajene in zunanje razliˇcice je zelo podobno, zato si bomo na tem mestu ogledali le vgrajeni razliˇcici.

Osnovni ukaz za izpis je echo [-neE] [arg . . .]

Ukaz izpiˇse podane argumente, med seboj loˇcene s presledkom, na koncu pa doda ˇse skok v novo vrstico. Pri tem lahko uporabimo naslednja stikala:

• -n . . . opusti skok v novo vrstico,

• -e . . . omogoˇci interpretacijo ubeˇznih znakov,

• -E . . . onemogoˇci interpretacijo ubeˇznih znakov.

Privzeti naˇcin delovanja je, da se ubeˇzni znaki ne interpretirajo. Vklop stikala e pa omogoˇci uporabo ubeˇznih znakov:

Znak Opis

\a opozorilo (zvonˇcek)

\b vraˇcalka oz. pomik levo za en znak

\f naslednja vrstica

\n nova vrstica

\r skok na zaˇcetek vrstice

\t horizontalni tabulator

\v vertikalni tabulator

\\ leva poˇsevnica

\0nnn znak z osmiˇsko kodo nnn

\xnn znak s ˇsestnajstiˇsko kodo nn Oglejmo si ˇse nekaj primerov uporabe:

(15)

jure@ris:~>echo Ana Berta "Greta Cilka"

Ana Berta Greta Cilka

jure@ris:~>echo -e "12\b34\f56\n78"

134 ... znak 2 se prepiˇse 56 ... naslednja vrstica 78 ... nova vrstica

jure@ris:~>echo -e "12\r34\t56\v78"

34 56 ... zaˇcetek vrstice in tabulator 78 ... vertikalni tabulator jure@ris:~>echo -e "\0101\tA\t\x41"

A A A

Poznavalci programskega jezika C se bodo razveselili ukaza printf, ki omogoˇca izpis argumentov glede na podani format. Uporabimo ga na naslednji naˇcin:

printf [-v ime] f ormat arg . . .

Format podamo podobno kot pri C-jevski razliˇcici. Z uporabo stikala v, se namesto izpisa na standardni izhod izvede izpis v spremenljivko z danim imenom. Oglejmo si primer uporabe:

jure@ris:~>printf -v x "Trikotnik: a=%i, b=%i in c=%i." 3 4 5 ↿ jure@ris:~>echo $x

Trikotnik: a=3, b=4 in c=5.

Formatiran izpis pogosto pride prav pri izpisu veˇcje koliˇcine podatkov npr.:

1 f o r ma t=’%3 i %8.2 f EUR %s\n ’

2 p r i n t f ”Kos cena i z d e l e k\n”

3 p r i n t f ” $ f o r ma t ” 4 2 9 . 9 ’ miska ’

4 p r i n t f ” $ f o r ma t ” 2 1 4 5 . 6 ’ t r d i di sk ’

1.2.2 Vgrajeni in zunanji ukazi

Pri opisu ukazov echo in printf smo ˇze omenili, da (glede na ukazno lupino) loˇcimo dve vrsti ukazov:

• vgrajeni ukazi,

(16)

• zunanji ukazi.

Vgrajeni ukazi so del ukazne lupine, izven lupine teh ukazov ne moremo uporabljati. Zunanji ukazi pa so programi shranjeni v izvrˇsljivih da- totekah nekje v datoteˇcnem sistemu in niso del lupine. Te ukaze lahko uporabljamo v razliˇcnih lupinah, lahko jih zaˇzenemo celo v svojih pro- gramih. Zunanje ukaze lupina zaˇzene kot nov proces.

Ob zahtevi za izvedbo ukaza, lupina najprej preveri, ˇce obstaja us- trezen vgrajeni ukaz, ˇsele nato skuˇsa najti ustrezen zunanji ukaz. V kolikor lupina ne najde vgrajene razliˇcice in prav tako ne zunanje ra- zliˇcice, potem izpiˇse obvestilo o napaki. V primeru obstoja vgrajenega in zunanjega ukaza z enakim imenom, ima torej vgrajeni ukaz prednost.

Vseeno vˇcasih ˇzelimo zagnati zunanji ukaz, takrat moramo v ukazno vrstico navesti celotno pot ukaza.

Kje v datoteˇcnem sistemu pa lupina iˇsˇce zunanje ukaze, ki jih ˇzelimo izvesti? Seznam imenikov, katere lupina pregleda za obstoj ukaza, se nahaja v okoljski spremenljivki PATH. Gre za niz; posamezni imeniki pa so med seboj loˇceni z dvopiˇcjem. Primer seznama:

jure@ris:~>echo $PATH

/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin jure@ris:~>echo $PATH | tr ":" "\n" ... izpis po vrsticah

Pozorni bralec bo opazil, da v izpisanem seznamu ni trenutnega imenika (znak “.”). V njem lupina ukazov torej ne iˇsˇce. Zato za zagon ukaza, ki se nahaja v trenutnem imeniku, ni dovolj zapisati le njegovo ime (kot pogosto priˇcakujejo zaˇcetniki), ampak je potrebno podati pot do ukaza.

Z uporabo relativnega naˇcina naslavljanja to enostavno naredimo tako, da pred ime ukaza dodamo predpono “./”. Oglejmo si primer zagona skripte shrani.sh v trenutnem delovnem imeniku:

jure@ris:~>./shrani.sh

1.2.3 Tip ukaza: type

Vˇcasih za nek ukaz ne vemo ali gre za vgrajeni ali za zunanji ukaz. Dilemo lahko hitro razreˇsimo s pomoˇcjo ukaza:

type [-aft] ukaz . . .

Ukaza izpiˇse tip in lokacijo podanega ukaza. Tip ukaza je lahko:

(17)

• alias – vzdevek oz. okrajˇsava,

• keyword – kljuˇcna beseda skriptnega jezika,

• function – definirana funkcija,

• builtin – vgrajeni ukaz,

• file – zunanji ukaz.

Pri tem lahko uporabimo naslednja stikala:

• -a . . . izpis vseh najdiˇsˇc ukaza,

• -f . . . ignoriraj funkcije,

• -t . . . izpis tipa ukaza.

Oglejmo si nekaj primerov:

jure@ris:~>type -a dir if printf ↿

dir is /bin/dir

if is a shell keyword printf is a shell builtin printf is /usr/bin/printf

jure@ris:~>function izpis { echo "Juhuhu"; } ... definicija funkcije jure@ris:~>type -t izpis

function

1.2.4 Iskanje programa ukaza: which

Vˇcasih ˇzelimo izvedeti, v katerem imeniku se nahaja program, ki se izvede ob zagonu nekega ukaza. Pomaga nam naslednji ukaz:

which [-as] ukaz . . .

Pregledajo se imeniki iz seznama PATH – v navedenem vrstnem redu – izpiˇse pa se prva najdenena lokacija. Poleg tega se vrne izhodni status o obstoju programa – saj lahko podanega ukaza which ne najde.

Podprti sta tudi naslednji stikali:

• -a . . . izpis vseh lokacij,

(18)

• -s . . . utiˇsanje izpisa lokacije (le status o obstoju).

Pokaˇzimo delovanje ukaza ˇse na primeru.

jure@ris:~>which ls man echo sudo

/bin/ls /usr/bin/man /bin/echo /usr/bin/sudo

jure@ris:~>which blabla; echo $?

1

1.3 Pomoˇ c pri uporabi ukazov

1.3.1 Vgrajena pomoˇ c

V lupini je na voljo veliko dodatne pomoˇci za uporabo ukazov. Ko smo uporabe ukazov ˇze dobro vajeni, vˇcasih potrebujemo le kratko pomoˇc za ukaz. To dobimo, kadar ukaz zaˇzenemo s stikalom help:

ukaz --help

Omenimo ˇse, da vsi ukaz ne podpirajo omenjenega stikala.

1.3.2 Priroˇ cnik: man

Kadar pa potrebujemo podrobnejˇso pomoˇc, se je najbolje obrniti na vgra- jeni priroˇcnik, ki ga dobimo na naslednji naˇcin:

man ukaz

Na zaslonu se prikaˇze pomoˇc za podani ukaz. Po pomoˇci se premikamo s smernimi tipkami, konˇcamo pa s tipko “q”. Veˇc o uporabi vgrajene pomoˇci pa izvemo, ˇce si ogledamo temo priroˇcnik, t.j. poˇzenemo man man.

Povejmo ˇse, kako prikaˇzemo pomoˇc za v lupino bashvgrajene ukaze.

Potrebno je izvestiman bashin potem znotraj prikazane pomoˇci poiskati ukaz, ki nas zanima. Pomoˇc je precej dolga, zato priporoˇcamo uporabo iskanja (leva poˇsevnica + iskani niz).

(19)

Poglavje 2

Skriptni jezik bash

2.1 Pisanje skript

2.1.1 Zgradba skripte

Ko zaˇzenemo lupino bash in se pojavi pozivnik, se lupina nahaja vinter- aktivnem naˇcinu; v ukazno vrstico vtipkamo ukaz, nato ga lupina poskuˇsa izvesti. Kadar lupina ne more izvesti ukaza, npr. je napaˇcno formuliran ali pa ga ne najde, se izpiˇse kratko sporoˇcilo o nastali teˇzavi, sicer sama lupina ne izpiˇse niˇc. Seveda pa lahko tekom izvajanja sam ukaz izpiˇse ˇse morebitna sporoˇcila

Pri praktiˇcni uporabi ukazne lupine so nekatera opravila sestavljena iz (daljˇsega) zaporedja veˇcih ukazov ali pa nekatera opravila pogosteje ponavljamo. Ponavljajoˇce tipkanje istega zaporedja ukazov za uporab- nika postane zelo utrujajoˇce. Zato takˇsno zaporedje ukazov navadno zapiˇsemo v datoteko. Ob vsaki potrebi po izvajanju opravila lupini pre- prosto naroˇcimo, naj izvede ukaze zapisane v datoteki. Takˇsno datoteko imenujemo skripta1, naˇcin uporabe lupine pa neinteraktivni naˇcin.

Skripta je navadne tekstovna datoteka, njena vsebina je zaporedje ukazov oz. program. Konˇcnica imena datoteke je po dogovoru “sh”, ni pa to nujno. ˇCe ˇzelimo skripto zagnati, moramo imeti dovoljenje za njeno izvajanje.

Prva vrstica bash skripte je navadno naslednje oblike:

1angl. script

19

(20)

#!/bin/bash

Prva dva znaka “#!” skupaj – gledano kot 16 bitno ˇstevilo – pravza- prav predstavljata ˇcarobno ˇstevilo2, ki pove za katero vrsto datoteke gre. Zaporedje “#!” torej pove, da gre za skripto. Poleg tega pa temu zaporedju sledi ˇse pot do programa za tolmaˇcenje skripte, v naˇsem primeru /bin/bash. Seveda lahko uporabimo tudi kateri drug tolmaˇc, npr. /bin/cat, /usr/bin/perl, /usr/bin/python ali celo /bin/rm. V veˇc skriptnih jezikih, tudi v bash, je znak za zaˇcetek vrstiˇcnega komen- tarja “#”. Zgornja vrstica je torej z vidika tolmaˇca komentar.

2.1.2 Zagon skripte

Skripto zaˇzenemo, da v ukazno vrstico napiˇsemo ime skriptne datoteke.

Seveda moramo pred tem imeti dovoljenje za izvajanje datoteke, ki ga nastavimo takole (veˇc o dovoljenjih v nadaljevanju):

jure@ris:~>chmod u+x skripta.sh ... dovoljenje za izvajanje

⇂ Ce se skripta nahaja v trenutnem imeniku, potem jo izvedemo takole:ˇ jure@ris:~>./skripta.sh ... izvedemo datoteko skripta.sh

⇂ Skripto lahko zaˇzenemo tako, da ime skriptne datoteke podamo ukazu bash kot argument:

jure@ris:~>bash skripta.sh ... zaˇzenemo ukaz bash

⇂ V obeh naˇstetih naˇcinih se ustvari nov proces – podlupina – v kateri se izvede skripta. Vˇcasih tega ne ˇzelimo, ampak ˇzelimo skripto izvesti v trenutni lupini, takrat uporabimo:

jure@ris:~>source skripta.sh ... izvedemo skripto v trenutni lupini

⇂ Zadnji naˇcin je uporaben za pisanjebashknjiˇznic oz. za uvoz skript. Na primer, ˇce ˇzelimo uvoziti vse funkcije, ki so definirane v neki skripti.

2.1.3 Okolje skripte

Kako skripta komunicira z uporabnikom in drugimi procesi? Obstaja mnogo naˇcinov. Podrobneje si jih bomo ogledali v nadaljevanju, na tem

2angl. magic number, glej tudiman magic

(21)

mestu pa podajmo le njihov pregled.

Argumenti skripte. Skripti lahko preko ukazne vrstice podamo argu- mente, ki jih med seboj loˇcimo s presledkom. ˇCe se argument zaˇcne z “-”, mu reˇcemo stikalo.

Standardni vhod, izhod in izhod za napake. Povedano enostavne- je, standardni vhod predstavlja tipkovnica, standardni izhod in standardni izhod za napake pa zaslon.

Okoljske spremenljivke. Skripta lahko uporabi vrednosti predhodno izvoˇzenih spremenljivk.

Izhodni status. Vsaka skripta se konˇca z nekim izhodnim statusom.

Vrednost niˇc predstavlja uspeˇsno izvedbo skripte, vse ostale vred- nosti pa pomenijo neuspeh.

Datoteke. Skripta lahko uporablja datoteke.

Signali. Skripta lahko uporablja signale, ki so poseben naˇcin sistemske medprocesne komunikacije.

2.1.4 Konˇ canje skripte: exit

Vsak ukaz – torej tudi vsaka skripta – ob svojem konˇcanju vrne izhodni status. Pri tem vrednost niˇc predstavlja uspeˇsen zakljuˇcek ukaza oz.

vrednost resniˇcno, vse ostale vrednosti pa neuspeˇsno izvajanje ukaza oz.

vrednost neresniˇcno in navadno opozarjajo na teˇzavo pri izvedbi ukaza.

Izvajanje skripte se zakljuˇci, ko se izvede njen zadnji ukaz ali ˇce ek- splicitno zahtevamo njeno konˇcanje. Slednje naredimo z ukazom:

exit [status]

Poleg konˇcanja skripte ukazexitomogoˇca ˇse navedbo izhodnega statusa katerega vrne skripta. ˇCe tega ne navedemo, se privzame izhodni status ukaza, ki se je izvedel tik pred exit.

jure@ris:~>( exit 42 ); echo $? ↿

42

jure@ris:~>( false; exit ); echo $?

1

(22)

2.2 Sestavljanje ukazov

Pri vsakodnevnem delu v lupini se pogosto pojavi potreba po zahtevnejˇsi uporabi ukazov. Iz enostavnejˇsih ukazov lahko tvorimo zapletenejˇse na veˇc naˇcinov. V nadaljevanju si jih oglejmo.

2.2.1 Zaporedno izvajanje

Najpogostejˇsi naˇcin izvajanja veˇc ukazov je izvajanje ukazov drugega za drugim oz. zaporedno izvajanje. Prvega naˇcina zaporednega izvajanja smo pravzaprav ˇze dobro vajeni. Uporabljamo ga, kadar ukaze vnaˇsamo v ukazno vrstico. Izvajanje ukazne vrstice zahtevamo s pritiskom tipke Enter, s ˇcimer smo pravzaprav vnesli znak EOL. Seveda lahko zaporedje ukazov zapiˇsemo tudi v datoteko, v vsako vrstico svoj ukaz in nato zahte- vamo izvajanje datoteke. ˇSe vedno pa se bodo posamezne vrstice izvedle druga za drugo.

Drugi naˇcin je enakovreden zgornjemu, pri ˇcemer namesto loˇcila EOL uporabimo znak “;”, tako kot v mnogih drugih programskih jezikih. Oba naˇcina lahko med seboj poljubno kombiniramo, pri tem uporabimo naˇcin, ki omogoˇca veˇcjo preglednost izvorne kode.

Pri obeh naˇcinih naˇstevanja ukazov je pomembno, da lupina naˇstete ukaze izvaja v strogem zaporedju, tako kot si sledijo v seznamu, t.j.

ˇsele ko konˇca z izvajanjem predhodnega ukaza, nadaljuje z izvajanjem naslednjega.

Oglejmo si naslednji primer zaporedja ukazov:

pushd .; cd ~; ls; popd

Najprej shranimo trenutni delovni imenik, se premestimo v domaˇci imenik uporabnika, izpiˇsemo njegovo vsebino in se vrnemo v prvotni imenik.

2.2.2 Pogojno izvajanje

Drugi naˇcin sestavljanja ukazov je pogojno izvajanje. V osnovi je to ˇse vedno zaporedno izvajanje, vendar pri tem ni nujno, da se vsak izmed naˇstetih ukazov dejansko izvede, ampak je izvedba posameznega ukaza odvisna od izvedbe predhodno naˇstetih ukazov. Poznamo dva osnovna

(23)

naˇcina pogojnega izvajanja. Prvi naˇcin, imenovan “in”-naˇcin, uporabl- jamo s pomoˇcjo operatorja&&:

ukaz1 && ukaz2

Pri tem se najprej izvede ukaz1 in ˇce je njegov izhodni status resniˇcno, potem se izvede ˇse ukaz2 sicer pa ne.

Drugi naˇcin, imenovan “ali”-naˇcin, dobimo z operatorjem ||:

ukaz1||ukaz2

Pri tem naˇcinu se najprej izvede ukaz1 in ˇce je njegov status neresniˇcno, potem se izvede ˇse ukaz2, sicer pa ne.

Pozoren bralec je opazil, da se pogojno izvajanje ukazov izvrˇsi po tako imenovani metodi kratkostiˇcnega izvajanja, kar pomeni, da se izvede le toliko ukazov, kot je potrebno za logiˇcno evalvacijo izraza. Tega smo sicer vajeni iz marsikaterega programskega jezika, vendar pa je lupini pomembna razlika – operator&& nima prednosti pred ||, kot smo morda vajeni.

Oglejmo si nekaj primerov medsebojnega sestavljanja treh echouka- zov, ki z izpisom zelo nazorno pokaˇzejo, kateri se izvedejo in kateri ne (izhodni status ukaza echo je resniˇcno):

jure@ris:~>echo 1 && echo 2 && echo 3 ↿ 1

2 3

jure@ris:~>echo 1 || echo 2 || echo 3 1

jure@ris:~>echo 1 || echo 2 && echo 3 1

3

2.2.3 Zdruˇ zevanje ukazov

Veˇc ukazov lahko zdruˇzimo skupaj (zdruˇzeni sklop navzven deluje kot samostojna celota) z uporabo zavitih oklepajev:

{ ukaz ; }

(24)

Znotraj oklepajev seveda lahko uporabimo ostale naˇcine sestavljanja uka- zov. ˇSe posebej pa bodimo pozorni na podpiˇcje, ki mora obvezno stati za zadnjim ukazom znotraj zavitih oklepajev. Poleg tega mora za pred- klepajem in pred zaklepajem obvezno biti vsaj en presledek, sicer zaviti oklepaji dobijo drugaˇcen pomen.

Oglejmo si ˇse primer zdruˇzevanja ukazov:

jure@ris:~>{ echo -n 1; echo -n 2; echo -n 3; }

123

2.2.4 Izvajanje v podlupini

Navadno izvajanje v podlupini

Vˇcasih ˇzelimo ukaz ali veˇc ukazov izvesti v samostojni lupini kot nov neodvisen proces. Temu pravimoizvajanje v podlupini. Povedano druga- ˇce, v trenutni lupini se ustvari nova lupina in ukazi se izvedejo v njej. Pri tem je proces podlupine otrok procesa trenutne lupine. Ukaze izvedemo v podlupini na naslednji naˇcin:

( ukaz )

Podlupina je samostojen proces, ki kot vsak proces, vrne izhodni sta- tus. Ta status prejme lupina, ki je starˇs podlupine. Izhodni status za- poredja ukazov, izvajanega v podlupini, je enak izhodnemu statusu zad- njega ukaza. Izvajanja v podlupini lahko gnezdimo, globino gnezdenja pa izvemo z branjem spremenljivke $BASH SUBSHELL.

Oglejmo si ˇse nekaj primerov. Najprej preverimo izhodni status izva- janja veˇc zaporednih ukazov v podlupini:

jure@ris:~>( echo "Imenik: "; pwd; false ) ... zadnji ukaz vraˇca

status

Imenik: /home/jure

jure@ris:~>echo $? ... izpis izhodnega statusa podlupine

1

Ce v podlupini uporabimoˇ exit, potem ta podaja izhodni status:

jure@ris:~>( echo "Zivjo"; exit 42; echo "svet." )

Zivjo

jure@ris:~>echo $? ... izpis izhodnega statusa podlupine

(25)

42 ⇂ Primer veˇckratnega gnezdenja izvajanja v podlupini nazorno podaja na-

slednji primer:

jure@ris:~>( ( ( (echo -n $BASH SUBSHELL) );echo $BASH SUBSHELL) ) ↿

42

Prvi echo je odgovoren za izpis ˇstevila 4, drugi pa za 2, kar sta seveda trenutni globini podlupin na nivoju ukazov echo.

Izvajanje v podlupini s substitucijo ukaza

Izvajanje v podlupini se najpogosteje uporablja v tako imenovani obliki substitucija ukaza3. Gre za to, da se ukaz najprej izvede v podlupini, nato pa se nadomesti s svojim standardnim izhodom. Substitucijo ukaza izvedemo z:

$(ukaz)

Podani ukaz (ali veˇc ukazov) se, kot ˇze reˇceno, najprej izvedejo v pod- lupini. Nato se izvede substitucija ukaza, kar pomeni naslednje: stan- dardni izhod izvedenega ukaza se zajame in se zamenja s samim ukazom (vkljuˇcno z$()). Za laˇzje razumevanje si lahko na mestu $(ukaz) pred- stavljajmo standardni izhod izvedenega ukaza.

Oglejmo si nekaj primerov. Najprej ˇzelimo izvedeti v katerem imeniku se nahaja ukaz less:

jure@ris:~>dirname $(which less) ↿

/usr/bin

Odgovor smo izvedeli s pomoˇcjo ukazov which, ki izpiˇse pot do danega ukaza, indirname, ki izpiˇse le imenik dane poti. V zgornjem primeru se najprej izvedewhich less, ki na standardni izhod izpiˇse/usr/bin/less.

Zaradi substitucije pa se standardni izhod zajame in poda ukazudirname, ki torej prejme/usr/bin/less, iz ˇcesar ohrani le imenik /usr/bin.

Veˇc substitucij ukaza lahko tudi poljubno gnezdimo. Primer, ki izpiˇse cilj simboliˇcne povezave vi:

jure@ris:~>echo Ukaz vi kaˇze na: $(readlink $(which vi)) ↿

3angl. command substitution

(26)

Ukaz vi kaˇze na: vim

Namesto sintakse$(ukazi)se za substitucijo ukaza pogosto uporablja tudi enakovreden naˇcin z enojnimi poˇsevnimi narekovaji, t.j.

`ukazi`

2.3 Spremenljivke

2.3.1 Definicija spremenljivk

Spremenljivke so temelj mnogih programskih jezikov. Omogoˇcajo nam, da vrednostim dodelimo neko simboliˇcno ime. V programskem jeziku bash spremenljivk ni potrebno posebej deklarirati in jim s tem dodeliti tipa. Definiramo pa jih tako, da jim priredimo neko vrednost. O tipih spremenljivk v jeziku bash pravzaprav sploh ne govorimo. Najlaˇzje pa je shajati, ˇce si kot tip vseh spremenljivk predstavljamo niz znakov.

Nekatere operacije sicer priˇcakujejo tudi drugaˇcen tip, npr. ˇstevilo, takrat se opravi implicitna pretvorba niza v ustrezen tip, rezultat takˇsne operacije pa je zopet niz.

Oglejmo si najprej, kako vbashdefiniramo spremenljivko in ji prired- imo vrednost:

ime=vrednost

Pri tem je zelo pomembo, da pred in po enaˇcaju ni presledkov! (Sicer bash skuˇsa zagnati ukazime z argumentoma = in vrednost.)

Zgornji prireditveni stavek ustvari globalno spremenljivko. To pomeni, da je spremenljivka dostopna v glavnem programu, prav tako pa tudi v vseh funkcijah. Vˇcasih pa ˇzelimo, da je spremenljivka definirana znotraj funkcije, dostopna le znotraj funkcije. Takim spremenljivkam pravimo lokalne spremenljivke in jih definiramo z:

local ime=vrednost

Spremenljivko je moˇzno zavarovati pred spreminjanjem, kar naredimo z:

readonly ime=vrednost

(27)

ali pa izbrisati njeno vrednost z unset ime

V lupini obstaja ˇse ena posebna vrsta spremenljivki, to so izvoˇzene spremenljivke, ki jih definiramo z:

export ime=vrednost

Takˇsne spremenljivke so dostopne (za branje) vsem podprocesom, ki jih morebiti ustvarimo v lupini. Drugaˇce povedano, ko v lupini ustvarimo nov proces, ta deduje izvoˇzene spremenljivke.

Opozorimo, da se izvoˇzene spremenljivke le kopirajo; spreminjanje njihove vrednosti v enem procesu se ne odraˇza v ostalih. ˇCe torej v podlupini spremenimo vrednost spremenljivke, se to ne odraˇza v lupini.

jure@ris:~>a=algoritem; ( a=logaritem ); echo $a ↿

algoritem

Oglejmo si ˇse en primer, ki ponazarja razliko med podlupino ustvar- jeno z (ukaz) in z ukazom bash.

jure@ris:~>a=1; export b=2 ... dve spremenljivkijure@ris:~>( echo $a $b ) ... vidnost v neposredni podlupini

1 2

jure@ris:~>bash ... zagon novega bash

jure@ris:~>echo $a $b ... vidnost v podlupini

2

2.3.2 Uporaba spremenljivk

Spremenljivke lahko v jeziku bashuporabljamo na dva naˇcina. Osnovni naˇcine je:

${ime}

ali krajˇsi naˇcin, brez zavitih oklepajev:

$ime

Bolj pogosto se sicer uporablja krajˇsi naˇcin, vˇcasih pa smo prislijeni uporabiti daljˇsega, npr. pri stiku spremenljivke in niza.

(28)

Uporaba spremenljivke – kombinacija znaka$in imena spremenljivke – predstavlja substitucijo. To je zamenjava spremenljivke z njeno vse- bino. Pri programiranju moramo sami poskrbeti, da so vse substitucije smiselne. Npr. kjer se na mestu spremenljivke priˇcakuje ˇstevilo, mora spremenljivka tudi vsebovati ˇstevilo. Drugaˇce povedano, vrednost, ki jo spremenljivka vsebuje, mora biti zdruˇzljiva z operacijo, ki jo izvajamo nad spremenljivko.

Oglejmo si ˇse nekaj primerov uporabe spremenljivk.

jure@ris:~>a=abra ... spremenljivki a priredimo vrednost abra

jure@ris:~>echo $a ... izpiˇsemo vrednost spremenljivke a abra

jure@ris:~>echo ${a}kad$a ... uporaba ${a}

abrakadabra

jure@ris:~>export b=kad ... spremenljivki b priredimo kad in jo izvoz- imo

jure@ris:~>( echo $a$b$a ) ... dostopnost spremenljivk a in b v pod- lupini ()

abrakadabra

jure@ris:~>bash ... zaˇzenemo podlupino zbash

jure@ris:~>echo $a$b$a ... dostopnost spremenljivk a in b v podlupini bash

kad

Poleg zgornje enostavne razˇsiritve spremenljivke z njeno vsebino ob- staja ˇse nekaj naprednejˇsih. Oglejmo si nekaj zanimivejˇsih. Pogosto ˇzelimo uporabiti neko spremenljivko, pa ta ni definirana. Takrat lahko uporabimo privzeto vrednost takole:

${ime:-privzeto}

ali pa, ˇce spremenljivka ˇse ni definirana, lahko privzeto vrednost spre- menljivki celo nastavimo:

${ime:=privzeto}

Uporaba privzete vrednosti je uporabna pri obdelavi argumentov skripte;

npr. kadar uporabnik ne poda ustreznega argumenta:

1 d a t o t e k a=${1:−i z h o d . t x t}

(29)

Obstaja ˇse nekaj razˇsiritev za obdelavo nizov. Dolˇzino niza shran- jenega v neki spremenljivki dobimo z:

${#ime}

Razˇsiritvi, ki vrneta podniz shranjenega niza pa sta:

${ime:poz}

ki vrne podniz od pozicije poz do konca niza, pri ˇcemer je prvi znak na mestu 0, in:

${ime:poz:dol}

ki vrne podniz dolˇzine dol s priˇcetkom na poziciji poz. Odmik poz je moˇzno podati tudi s konca niza, tako da podamo negativno ˇstevilo, ki pa mora biti obvezno v oklepajih. Oglejmo si ˇse nekaj primerov:

1 a=” I s k a n j e po dni zo v . ”

2 echo ${a : 8} # p o d n i z o v .

3 echo ${a : 1 1 : 3} # n i z

4 echo ${a : (−6 ) : 3} # n i z

Dele shranjenega niza je moˇzno tudi odstraniti. Odstranjevanje pred- pone shranjenega niza lahko izvedemo na dva naˇcina. V prvem naˇcinu gre za odstranjevanje najkrajˇse predpone, ki se ujema z danim vzorcem:

${ime#vzorec}

in v drugem za odstranjevanje najdaljˇse predpone, ki se ujema z danim vzorcem:

${ime##vzorec}

Podobno lahko shranjenemu nizu odstranimo pripono; najkrajˇso pripono z:

${ime%vzorec}

in najdaljˇso z:

${ime%%vzorec}

Oglejmo si ˇse kako nek podniz zamenjamo, oz. natanˇcneje v shranjenem

(30)

nizu ˇzelimo poiskati prvi najdaljˇsi podniz, ki se ujema z vzorcem, in zamenjati s podano vrednostjo:

${ime/vzorec/vrednost}

V primeru, da je ujemajoˇcih se podnizov veˇc, lahko zamenjamo vse, ˇce se vzorec priˇcne z znakom “/”. Za laˇzje razumevanje si oglejmo nekaj primerov:

1 d a t o t e k a=” s l i k a−20−10−2010−t o r t a ”

2 # o d s t r a n i t e v n a j k r a j s e predpone , k i s e konca z −

3 tmp=${d a t o t e k a#∗−} # 20−10−2010−t o r t a

4 # o d s t r a n i t e v n a j d a l j s e predpone , k i s e konca z −

5 ime=${d a t o t e k a##∗−} # t o r t a

6 # o d s t r a n i t e v n a j k r a j s e p ri p o n e , k i s e z a c n e z −

7 datum=${tmp%−∗} # 20−10−2010

8 # zamenjava v s e h 20 v 30

9 echo ${datum//20/30} # 30−10−3010

10# zamenjava datuma z −

11 echo ${d a t o t e k a/−∗−/−} # s l i k a−t o r t a

Vˇcasih neka spremenljivka hrani ime druge spremenljivke. ˇCe ˇzelimo dobiti vsebino te druge spremenljivke, uporabimo tako imenovano posre- dno razˇsiritev:

${!ime}

Primer posredne razˇsiritve v lupini:

jure@ris:~>a=123

jure@ris:~>b=a

jure@ris:~>echo ${b} ${!b}

a 123

2.3.3 Branje standardnega vhoda: read

V skriptah vˇcasih potrebujemo uporabnikov odziv oz. vnos podatkov.

Pomagamo si lahko z branjem standardnega vhoda, kar nam omogoˇca ukaz:

(31)

read [stikala] [ime...]

S standardnega vhoda se prebere ena vrstica, ˇce ne zahtevamo drugaˇce.

Ukazu lahko podamo niˇc, eno ali veˇc imen spremenljivk. ˇCe imena ne podamo, se prebrana vrstica shrani v spremenljivkoREPLY. ˇCe podamo le eno ime, se prebrana vrstica shrani v spremenljivko s podanim imenom.

Ce pa podamo dve ali veˇc spremenljivk, se prva beseda vrstice prirediˇ prvi podani spremenljivki, druga beseda drugi itd., pri ˇcemer se zadnji spremenljivki priredijo preostale besede. Pri tem so besede v vrstici med seboj loˇcene glede na loˇcilne znake. Ti pa so shranjeni v spremenljivki IFS4, katere privzeta vrednost so znaki za presledek, tabulator in skok v novo vrstico.

Ukaz read s standardnega vhoda prebere vrstico. Kot vemo, so vrstice med seboj loˇcene z znakom za skok v novo vrstico. To lahko spremenimo s stikalom d. Kadar to naredimo, ne bomo veˇc govorili o branju vrstice, ampak o branju zapisa.

Oglejmo si ˇse nekaj zanimivejˇsih stikal:

• -d locilo . . . za loˇcevanje vrstic namesto loˇcila “\n” uporabi po- dano locilo,

• -e . . . za branje vrstice uporabi knjiˇznico readline (zgodovina vnosov),

• -n stevilo. . . prebere stevilo znakov namesto cele vrstice,

• -p poziv . . . izpiˇse sporoˇcilo pred vnosom,

• -s . . . tihi naˇcine, brez izpisa vneˇsenih znakov,

• -t timeout. . . ˇcakanje na uporabnikov odziv,

• -u f d. . . branje iz datoteˇcnega deskriptorja f d.

2.3.4 Vgrajene spremenljivke

Nekatere spremenljivke so rezervirane in vrnejo posebne vrednosti. Oglej- mo si nekaj pomembnejˇsih.

4angl. internal field separator

(32)

Ime Opis

# Stevilo podanih argumentov.ˇ 0 Ime skripte.

1, 2, . . . Posamezni argumenti skripte.

*, @ Vsi argumenti skripte skupaj.

? Izhodni status zadnjega (v ospredju) izvedenega ukaza.

$ PID lupine.

! PID procesa, ki je bil zadnji zagnan v ozadju.

2.3.5 Prednastavljene spremenljivke

Nekatere spremenljivke se avtomatsko nastavijo ob zagonu lupine. Zopet naˇstejmo samo nekaj zanimivejˇsih, daljˇsi spisek pa lahko najdete v pomoˇci zabash pod razdelkom ”Shell Variables”:

Ime Opis

BASH Pot do bash lupine.

BASH SUBSHELL Globina trenutne podlupine.

BASH VERSINFO Razliˇcica lupine.

COLUMNS ˇStevilo stolpcev konzole.

LANG Jezik.

LINES ˇStevilo vrstic konzole.

RANDOM Nakljuˇcno ˇstevilo od 0 do 32767.

SECONDS ˇStevilo sekund po zagonu lupine.

Se nekaj primerov uporabe.ˇ

jure@ris:~>( ( echo $BASH SUBSHELL ) ) ... globina podlupine

2

jure@ris:~>echo $LINES x $COLUMNS ... velikost terminala 24 x 80

jure@ris:~>echo $RANDOM ... nakljuˇcno ˇstevilo

42

2.3.6 Uporaba narekovajev

V lupini bash nize lahko navajamo brez narekovajev. Veˇckrat pa nas posebni znaki v nizu prisilijo k uporabi narekovajev. V ta nanem lupina nudi veˇc vrst narekovajev, pri ˇcemer ima vsaka vrsta svoj pomen:

(33)

Enojni narekovaji Dobesedno ohranjanje niza. Niz se ohrani natanko tak, kot je naveden.

Dvojni narekovaji Izvedba razˇsiritev (substitucij z $). Nad nizom se izvedejo razˇsiritve (npr. razˇsiritev spremenljivk).

Enojni nazaj-narekovaji Ima enak pomen kot uporaba $(niz).

Za boljˇse razumevanje razlike med delovanjem enojnih in dvojnih narekovajev si oglejmo naslednji primer.

jure@ris:~>echo ’`ls `’ ↿

`ls `

jure@ris:~>echo "`ls `" ... izpis vsebine domaˇcega imenika

2.4 Pogojni izrazi

Pogojni izrazi so izrazi s katerimi preverjamo nek pogoj. Najveˇc se uporabljajo v zankah in odloˇcitvenih stavkih, lahko pa so tudi samostojni, kot npr. izpis nekega statusa. Preverjanju pogojev so vbashpravzaprav namenjeni trije ukazi:

test pogoj

[ pogoj ] in

[[ pogoj ]]

Pri tem ukaza[in[[zahtevata, da je zadnji argument enak]oz. ]].

Zadnji ukaz je del lupine bash in omogoˇca veˇc kot prva dva. V kolikor ne uporabljamo drugih lupin razen bash, potem priporoˇcamo uporabo [[, ker je sintaktiˇcno manj teˇzaven. Z uporabo stikal navedemo, katero primerjavo ˇzelimo izvesti.

2.4.1 Primerjanje nizov

V spodnji tabeli najdemo naˇcine uporabe, kadar ˇzelimo medsebojno primerjati nize.

(34)

Operator Opis

-z niz Ali je dolˇzina niza enaka niˇc?

-n niz Ali je dolˇzina niza veˇcja od niˇc?

niz1 == niz2 Ali sta niza enaka?

niz1 != niz2 Ali sta niza razliˇcna?

niz1 < niz2 Ali jeniz1 pred niz2?

niz1 > niz2 Ali jeniz1 za niz2?

2.4.2 Aritmetiˇ cne primerjave

Lupinabashsicer ni namenjena reˇsevanju numeriˇcnih problemov, vendar vseeno omogoˇca nekaj aritmetiˇcnih primerjav.

Operator Opis

arg1 -eq arg2 Ali sta ˇstevili arg1 in arg2 enaki?

arg1 -ne arg2 Ali sta ˇstevili arg1 in arg2 razliˇcni?

arg1 -lt arg2 Ali je ˇstevilo arg1 manjˇse od arg2?

arg1 -le arg2 Ali je ˇstevilo arg1 manjˇse ali enako od arg2?

arg1 -gt arg2 Ali je ˇstevilo arg1 veˇcje od arg2?

arg1 -ge arg2 Ali je ˇstevilo arg1 veˇcje ali enako od arg2?

Omenimo ˇse, da aritmetiˇcne primerjave lahko izvajamo tudi z uporabo dvojnih oklepajev (( operacije )), kar je navadno ˇcloveku precej pri- jaznejˇse.

2.4.3 Preverjanje datotek

Z naˇstetimi ukazi lahko tudi preverjamo stanje datotek. Razliˇcne naˇcine uporabe navajamo v spodnji tabeli.

(35)

Operator Opis

-a datoteka Ali datoteka obstaja?

-e datoteka Ali datoteka obstaja?

-b datoteka Ali je datoteka bloˇcno-orientirana?

-c datoteka Ali je datoteka znakovno-orientirana?

-d datoteka Ali je datoteka imenik?

-f datoteka Ali je datoteka navadna datoteka?

-h datoteka Ali je datoteka simboliˇcna povezava?

-L datoteka Enako kot -h.

-r datoteka Ali je datoteka bralna?

-w datoteka Ali je datoteka pisalna?

-x datoteka Ali je datoteka izvrˇsljiva?

2.5 Programski stavki

2.5.1 Zanke

while in until

Osnovni dve vrsti zank, stawhileinuntil, ki ju uporabljamo na nasled- nja naˇcina:

while pogoj; do ukazi; done in

until pogoj; do ukazi; done

Obe zanki izvajata telo zanke, med njima pa je malenkostna razlika v pogoju. Prva se izvaja dokler je podani pogoj resniˇcen, druga pa dokler je neresniˇcen.

for

Poznamo ˇse forzanko, ki jo lahko uporabljamo na dva razliˇcna naˇcina.

Prvi naˇcin je:

for var in spisek; do ukazi; done

(36)

Pomen zanke je, da spremenljivka var zaporedno dobi vse vrednosti iz podanega spiska. Za vsako vrednost se izvedejo podani ukazi.

Drugi naˇcin, bolj podoben klasiˇcnim programskim jezikom, je:

for ((inicializacija; pogoj; inkrementacija)); do ukazi; done Znotraj slednje lahko uporabljamo sintakso podobno programskemu jeziku C.

select

Z ukazom select lahko ustvarimo tudi preprost meni. Uporaba:

select var in spisek; do ukazi; done

Takˇsen meni pravzaprav teˇce v neskonˇcni zanki, iz njega pa skoˇcimo z ukazom break. Izbire menija navedemo v spisku.

break in continue

Izvajanje zanke lahko predˇcasno prekinemo zbreak, moˇzno je celo prekiniti veˇc nivojev vgnezdenih zank, ˇce podamo ˇse parameter – ˇstevilo nivojev.

Preskok na naslednjo iteracijo zanke izvedemo s continue.

Primeri zank.

1 # n e p r e s t a n o i z p i s o v a n j e z v e z d i c

2 while true; do echo ”∗” ; s l e e p 2 ; done

3

4 # i z p i s seznama

5 f o r i i n banana j a g o da malina m a r e l i c a s l i v a ; do

6 echo $ i j e okusna

7 done

8

9 # numericna zanka

10 f o r i i n ‘ s e q 24 4 2 ‘ ; do echo −n ” $ i ” ; done

11 f o r ( ( i =24; i<=42; i ++)); do echo −n ” $ i ” ; done

12

13# p r e p r o s t i n t e r a k t i v n i meni

14 s e l e c t i z b o r i n ananas b o r o v n i c a j a b o l k o r o b i d a ; do

(37)

15 echo ” P o j e d e l sem $ i z b o r . ”

16 done

2.5.2 Odloˇ citveni stavki

if

Z odloˇcitvenimi stavki vejimo izvajanje programa. Sintaksa odloˇcitve- nega stavka v bashje:

if pogoj; then ukazi;

[ elif pogoj; then ukazi; ] ...

[ else ukazi; ] fi

Naˇstejmo ˇse nekaj pogostejˇsih krajˇsih oblik:

if pogoj; then ukazi; fi

if pogoj; then ukazi; else ukazi; fi

if pogoj; then ukazi; elif pogoj; then ukazi; fi

# veˇcvrstiˇcna oblika if pogoj; then ukazi; elif pogoj; then ukazi;

else ukazi; fi

case

Lupina omogoˇca tudi vejitev izvajanja glede na ujemanje niza z vzorcem.

V ta namen je na voljo stavek case:

case niz in

(vzorec) ukazi ;;

...

esac

Ce obstaja ujemanje medˇ nizom in vzorcem se izvedejo ukazi, ki so naˇsteti pri ustreznem vzorcu. Namesto enega vzorca lahko podamo tudi veˇc vzorcev, ˇce jih med seboj loˇcimo z |. Poleg tega lahko pri navajanu

(38)

vzorca predklepaj izpustimo. Vzorec, ki se ujema z vsemi nizi, je znak

”*”. Oglejmo si ˇse primer.

1 case $1 i n

2 ( c o m p i l e )

3 g cc t e t r i s . c −o t e t r i s ; ;

4 run )

5 . / t e t r i s ; ;

6 ( h e l p|h )

7 echo ”Read man ! ” ; ;

8 (∗)

9 echo ” Napacna uporaba . ” ; e x i t 42 ; ;

10 e s a c

2.5.3 Funkcije

Definicija funkcije

V lupini bash lahko definiramo tudi funkcije, ki jih je v skripti potrebno definirati preden jih uporabimo. Po definiciji funkcije uporabljamo enako kot ostale ukaze. Poznamo dva naˇcina definicije funkcij:

function ime { ukazi } in

ime () { ukazi }

Argumenti funkcije

Pozoren bralec je opazil, da pri definiciji funkcije nismo navedli argumen- tov. Pravzaprav pa so argumenti, podamo funkciji ob klicu, znotraj nje dostopni na enak naˇcin kot argumenti skipte, torej preko spremenljivk

$1, $2, itd.

Izhodni status funkcije

Iz funkcije pa se vrnemo z ukazom:

(39)

return [status]

Izhodni status funkcije bo enak podanemu. ˇCe pa ta ni podan, bo enak izhodnemu statusu zadnjega ukaza. V kliˇcoˇcem programu izhodni status funkcije preberemo v spremenljivki $?.

2.6 Preusmerjanje

2.6.1 Standardni vhod in izhod

Program v lupini z uporabnikom komunicira preko naslednjih vmesnikov:

• standardni vhod5 z oznako stdin in datoteˇcnim deskriptorjem 0,

• standardni izhod6 z oznako stdout n datoteˇcnim deskriptorjem 1,

• standardni izhod za sporoˇcila o napakah7 z oznako stderr in da- toteˇcnim deskriptorjem 2.

Standardni izhod je navadno povezan s tipkovnico, torej kar tipkamo lahko program prebere s svojega standardnega vhoda. Podobno je s standardnim izhodom in standardnim izhodom za napake, ki sta navadno povezana z zaslonom, torej karkoli program zapiˇse na kateregakoli izmed njiju, se dejansko izpiˇse na zaslon.

Standardni vmesniki so z vidika procesa pravzaprav datoteke, zato so prisotni v spisku odprtih datotek procesa. Preverimo! Oglejmo si kar proces lupine bash, ki jo trenutno uporabljamo:

jure@ris:~>cd /proc/$$/fd ... imenik, ki vsebuje odprte datoteke lupinejure@ris:~>ls ... izpis imenika oz. odprtih datotek

0 1 2

Ugotovimo, da so odprte tri datoteke z imeni 0, 1 in2. Imena datoteke v tem imeniku so pravzaprav datoteˇcni deskriptorji. Odprti so torej vsi trije standardni vmesniki. Izvedeli smo torej imena odprtih datotek z vidika procesa. Katere datoteke pa so dejansko odprte? Iz poglavja o

5angl. standard input

6angl. standard output

7angl. standard error

(40)

procesih lahko izvemo, da so zgornje tri datoteke pravzaprav simboliˇcne povezave. Oglejmo si kam kaˇzejo:

jure@ris:~>readlink 0 ... Kam kaˇze standardni vhod?

/dev/pts/1

jure@ris:~>readlink 1 ... Kam kaˇze standardni izhod?

/dev/pts/1

jure@ris:~>readlink 2 ... Kam kaˇze standardni izhod za napake?

/dev/pts/1

Ugotovimo, da vsi trije standardni vmesniki kaˇzejo na isto datoteko, t.j.

/dev/pts/1, ki pa je v resnici ena izmed (psevdo) konzol. Del vsake konzole pa je seveda tudi tipkovnica in zaslon.

Zgoraj smo predpostavili, da so standardni vmesniki vedno povezani s konzolo, vendar ni nujno vedno tako. Vsakega izmed njih lahko v lupini enostavno preusmerimo na drugo datoteko. V nadaljevanju si bomo ogledali razliˇcne naˇcine preusmerjanja.

2.6.2 Preusmerjanje standardnega vhoda in izhoda

Najprej si oglejmo preusmerjanje, ki se v praksi najpogosteje uporablja, t.j. preusmerjanje standardnega vhoda in izhoda. Standardni vhod ukaza lahko preusmerimo na neko datoteko na naslednji naˇcin:

ukaz <datoteka

Danadatoteka mora seveda ˇze obstajati, saj joukaz bere.

Podoben naˇcin uporabimo za preusmerjanje standardnega izhoda:

ukaz >datoteka

Ta preusmeritev zajame izpis ukaza in ga zapiˇse v dano datoteko. ˇCe datoteka ne obstaja, se ustvari nova datoteka, sicer pa se prepiˇse.

Vˇcasih ne ˇzelimo prepisati datoteke, ampak ˇzelimo izpis dodati na koncu datoteke. Takrat uporabimo naslednji naˇcin:

ukaz >>datoteka

Oglejmo si nekaj primerov preusmerjanja. Ukaz wc -l izpiˇse ˇstevilo vrstic, prisotnih na standardnem vhodu ali v podani datoteki, lahko pa mu datoteko podamo tudi na naslednji naˇcin:

(41)

jure@ris:~>wc -l < /etc/passwd ↾

53

Izpisalo se je ˇstevilo uporabniˇskih raˇcunov. ˇSe primeri preusmerjanja v datoteko:

jure@ris:~>echo "To bo prepisano." > pregovor.txt ↿ jure@ris:~>echo "Kdor drugemu jamo koplje," > pregovor.txt

jure@ris:~>echo "sam vanjo pade." >> pregovor.txt jure@ris:~>cat pregovor.txt

Kdor drugemu jamo koplje,

sam vanjo pade.

2.6.3 Cevovod

V praksi se pogosto zgodi, da podatke preoblikujemo, dokler ne doseˇzemo konˇcnega rezultata. Pri tem preoblikovanje poteka postopoma, korak za korakom, pri ˇcemer vsak korak izvedemo z enim izmed ukazov. Vmesni rezultati preoblikovanja na posameznem koraku nas navadno niti ne zan- imajo. Zelo moˇcno orodje, ki nam ga nudi lupina v takem primeru, je cevovod, ki ga uporabimo na naslednji naˇcin:

ukaz1 | ukaz2

Lupina izvede oba ukaza, ˇse pred tem pa standardni izhod prvega ukaza poveˇze s standardnim vhodom drugega. Povedano ˇse drugaˇce: karukaz1 izpiˇse, se preusmeri na vhod ukaza2.

Moˇzno je seveda sestaviti tudi daljˇse cevovode z veˇc ukazi. Vsak ukaz cevovoda je samostojen proces, ki teˇce vzporedno z ostalimi. ˇCe se katerikoli ukaz preneha izvajati, se tudi celoten cevovod zakljuˇci. Izhodni status cevovoda je enak izhodnemu statusu zadnjega ukaza.

Oglejmo si nekaj preusmerjanj. Izpis vsebine imenika v nasprotnem abecednem redu lahko doseˇzemo z:

jure@ris:~>ls | sort -r ... izpis in urejanje

Naslednji ˇseststopenjski cevovod izpiˇse pogostost (frekvenco) uporabe ⇃ razliˇcnih prijavnih lupin:

jure@ris:~>cat /etc/passwd | grep -Ev "#" | cut -d: -f7 | sort | ↿ uniq -c | sort -rg

(42)

17 /bin/sh 14 /bin/false 11 /bin/bash

1 /usr/sbin/nologin 1 /bin/sync

Oglejmo si ga po delih: cat izpiˇse dano datoteko, grep odstrani ko- mentarje, cut izloˇci odveˇcne stolpce, prvi sort uredi imena lupin po abecedi, uniq izloˇci zaporedne duplikate in jih preˇsteje in zadnji sort uredi frekvence.

Cevovode je najlaˇze sestavljati korakoma po stopnjah od zaˇcetka proti koncu; na vsakem koraku dodamo eno stopnjo in cevovod sproti preizkusimo. Posamezno stopnjo si lahko predstavljamo kot filter skozi katerega potujejo podatki.

2.6.4 Sploˇ sno preusmerjanje

Operacijski sistem za vsak proces vodi seznam odprtih datotek, do ka- terih proces dostopa preko datoteˇcnih deskriptorjev. Ogledali smo si ˇze preusmerjanje standardnega vhoda in izhoda, katerih deskriptorja sta 0 in 1. Kako pa je s preusmerjanjem poljubnih deskriptorjev? V lupini bash je moˇzno narediti tudi to.

Preusmerjanje iz dane datoteke na nek deskriptor naredimo takole:

ukaz deskriptor<datoteka

in preusmerjanje iz deskriptorja na dano datoteko takole:

ukaz deskriptor>datoteka

Pozor: pred znakoma “<” in “>” ne sme biti presledkov in ostalih belih znakov. Pri preusmerjanju izhoda lahko uporabimo tudi naˇcin dopiso- vanja z “>>”.

Moˇzno pa je celo izvesti preusmeritev med dvema poljubnima deskrip- torjema:

ukaz deskriptor1>&deskriptor2

Pozorni bodimo na znak “&” pred deskriptor2; ˇce ga ne bi bilo, bi se izvedla preusmeritev na datoteko.

(43)

Pogosto ˇzelimo preusmeriti standardni izhod za napake. Ker poz- namo njegov deskriptor, t.j. 2, znamo izvesti tudi ustrezno preusmeritev.

Oglejmo si primera:

jure@ris:~>cd neobstaja 2>error.log ... preusmeritev napakjure@ris:~>cat /etc/shadow 2>>error.log ... dopisovanje napak

Pogosto potrebujemo istoˇcasno preusmeritev tako standardnega izho- da kot standardnega izhoda za napake v neko datoteko. Izvedemo lahko dve preusmeritvi ”ukaz 1>datoteka 2>&1”, pri ˇcemer je prva preusmer- itev standardnega izhoda na dano datoteko in druga preusmeritev stan- dardnega izhoda za napake na ˇze preusmerjeni standardni vhod, t.j. na datoteko. ˇSe bolje pa je za istoˇcasno preusmeritev obeh standardnih izhodov uporabiti:

ukaz &>datoteka

Slednji naˇcin je boljˇsi, ker je vrstni red navajanja preusmeritev pomem- ben, saj se preusmeritve izvedejo od leve proti desni. Tako na primer

”ukaz 2>&1 1>datoteka” verjetno ne naredi ˇzelenega; najprej se izvede preusmeritev standardnega izhoda za napake na (ˇse ne preusmerjeni) standardni izhod, t.j. na konzolo, kar pomeni, da se napake ˇse vedno izpisujejo na zaslon.

Omenimo ˇse, da je moˇzno datoteke tudi odpreti za branje in pisanje.

To naredimo z operatorjem <> na naslednji naˇcin:

ukaz deskriptor<>datoteka

Potrebujemo ˇse zapiranje deskriptorja:

ukaz deskriptor<&- Oglejmo si primer:

jure@ris:~>exec 100<>temp.txt ... odpremo datoteko z deskriptorjem100

jure@ris:~>echo "Zeus" >&100 ... pisanje v datoteko jure@ris:~>echo "Jupiter" >&100 ... pisanje v datoteko jure@ris:~>exec 100<&- ... zapiranje deskriptorja

jure@ris:~>cat temp.txt Zeus

Jupiter

(44)

2.6.5 Preusmerjanje vhoda lupine

Tukaj–dokument

Naˇcin preusmerjanja, imenovantukaj-dokument8, zaˇcasno poveˇze trenutni vhod lupine s standardnim vhodom programa. Takˇsno preusmeritev naredimo z:

ukaz <<locilo

Vse vrstice, ki jih vnesemo za preusmeritvijo, gredoukazuna standardni vhod. Preusmeritev traja toliko ˇcasa, dokler se na vhodu ne pojavi posebna vrstica, ki vsebuje le podano loˇcilo.

To vrsto preusmerjanja pogosto izvajamo z ukazom cat. Oglejmo si naslednji primer:

1 cat<<KONEC

2 Ta v r s t i c a i n v s e o s t a l e do v r s t i c e KONEC

3 KONEC LONEC

4 g r edo ukazu cat na s t a n d a r d n i vhod .

5 KONEC

Na ta naˇcin lahko uˇcinkovito izpisujemo na konzolo. Lahko naredimo npr. skripto, ki izpiˇse svojo vsebino. Takim skriptam vˇcasih reˇcemo tudi cat-skripte.

Pri uporabi preusmerjanja vhoda lupine, se je potrebno zavedati, da se tekst, ki se nahaja med loˇciloma predprocesira. Namreˇc izvedejo se vse morebitne substitucije. Npr.

1 cat<<JUHU

2 $a

3 JUHU

V tem primeru na standardni vhod ukazacatpride vrednost spremenljivke ain ne niz ”$a”. ˇCe ˇzelimo predprocesiranje izklopiti, potem je potrebno loˇcilo dati v enojne narekovaje:

ukaz <<’locilo’

8angl. here document

(45)

Pravzaprav poznamo naslednje tri razliˇcne naˇcine izklopa predprocesir- anja:

• loˇcilo damo v enojne narekovanje, npr. ’KONEC’,

• pred loˇcilo damo levo poˇsevnico, npr. \KONEC,

• pred vsako uporabo razˇsiritve spremenljivke navedemo levo poˇsev- nico, t.j. pred vsemi znaki “$”, npr. \$a.

Uporabna je tudi kombinacija tukaj-dokument in preusmeritve stan- dardnega vhoda. Na primer:

1 cat <<’KONEC’ >do ma pr est ej . sh

2 #! / b i n / b a s h

3 cd ˜

4 s t=$ ( l s | wc −w)

5 e x i t $ s t

6 KONEC

Zgornji primer ustvari novo datoteko z imenomdomaprestej.sh, v katero zapiˇse bash program – naveden do loˇcila. Na takˇsen naˇcin lahko ustva- rimo preproste namestitvene skripte.

Tukaj-dokument pa je uporaben tudi, kadar ˇzelimo, poleg bash, upora- biti ˇse kak drug (interpretiran) programski jezik, kot npr. Perl ali Python.

Primer uporabe:

1 python<<’KONEC’

2 p r i n t ( ”To j e program v pythonu . ” )

3 f o r i i n r a ng e ( 2 4 , 42+1):

4 p r i n t i

5 KONEC

Tukaj-niz

Oglejmo si ˇse en naˇcin preusmerjanja, imenovan tukaj-niz9. Pri tem pravzaprav ne gre ravno za preusmerjanje vhoda lupine, vendar pa je

9angl. here string

(46)

uporaba zelo podobna naˇcinu tukaj-dokument, zato si ga oglejmo na tem mestu. Tukaj-niz uporabljamo na naslednji naˇcin:

ukaz <<< niz

Podaninizse najprej razˇsiri, nato pa se podaukazuna njegov standardni vhod.

Oglejmo si ˇse naslednji primer:

jure@ris:~>cat <<< "Vsaka ˇsola nekaj stane."

Vsaka ˇsola nekaj stane.

(47)

Poglavje 3 Uporabniki

3.1 Osnovno delo

3.1.1 Uporabniˇ ski raˇ cuni

Linux je veˇcuporabniˇski operacijski sistem, kar pomeni, da z enim sis- temom lahko hkrati dela veˇc uporabnikov. Vsak uporabnik mora imeti dovoljenje za uporabo sistema, ki ga pridobi od sistemskega administra- torja. Ta novemu uporabniku ustvari uporabniˇski raˇcun1 in mu s tem dodeli uporabniˇsko ime2 ter zaˇcetno geslo3. Priporoˇcljivo je, da dodel- jeno geslo uporabnik ˇcim prej spremeni. Uporabniˇsko ime je vezano na identifikacijsko ˇstevilko uporabniˇskega raˇcuna, ki jo bomo krajˇse oznaˇcili z uid.

Uporabniˇsko ime in geslo uporabnik vnese ob prijavi4 v sistem. Po konˇcani uporabi sistema se uporabnik praviloma odjavi5. Z enim upora- bniˇskim imenom se je moˇzno v sistem istoˇcasno prijaviti veˇckrat. Ob (terminalski) prijavi v sistem se najprej zaˇzene uporabnikova prijavna ukazna lupina6, ki jo uporabnik lahko nemudoma priˇcne uporabljati.

Novemu uporabniku je dodeljen tudidomaˇci imenik7. V njem uporab-

1angl. user account

2angl. username

3angl. password

4angl. login

5angl. logout

6angl. login shell

7angl. home directory

47

Reference

POVEZANI DOKUMENTI

Ce ˇ ˇ zelimo pin uporabiti kot izhod moramo poleg zgoraj omenjenih regi- strov nastaviti ˇse registra, ki doloˇ cata naˇ cin izhoda ter hitrost osveˇ zevanja.. Hitrost osveˇ

Poleg tega, ˇ ce uporabljamo mikrostoritve in skupno bazo podatkov, smo pri skaliranju omejeni z zgornjo mejo skalabilnosti sku- pne baze podatkov (ˇ ce imamo 5 mikrostoritev in

Res je, da smo ˇ zeleli slike izbrisati petnajst sekund po objavi, vendar pa veˇ cina socialnih omreˇ zjih te slike ˇse vedno hrani, ˇ ceprav jih ne vidimo veˇ c. In ˇ ce se

Ce podamo dodatni parameter, za katerega udeleˇ ˇ zenca ˇ zeli odgovorna oseba pridobiti poroˇ cilo, se poroˇ cilo izpiˇse na enak naˇ cin, le da so tiste celice, ki prikazujejo

Torej, ˇ ce imamo bolj enostavno aplikacijo, ki uporablja na primer podatke GPS, potem bi se odloˇ cili za Tile38, ˇ ce je potrebno bolj napredno iskanje prostorskih podatkov, tudi

Ceprav je metoda razvrˇsˇ ˇ canja z zdruˇ zevanjem najbliˇ zjih sosedov lahko ˇse ve- dno uporabna za gruˇ cenje, deluje dobro za izdelavo filogenetskih dreves le, ˇ ce

Ker se lahko lokacije vremenskih podatkov rahlo razlikujejo od generiranih lokacij, program ˇ se enkrat preveri, ˇ ce so vse lokacije znotraj izbranega obmoˇ cja in ˇ ce so vse ˇ

Ko imamo izraˇ cunane indekse za posamezne kategorije, moramo izraˇ cunati ˇse konˇ cni indeks. Ker pa po- troˇsniki troˇsijo manj dobrin, ki se draˇ zijo, bi bilo bolje, ˇ ce