Poglavlje 8 Školjka Tabela sadržaja 8.1 Korisnici 8.2 Naredbena linija 8.3 Bourne Again Shell (bash) 8.4 Virtualni Terminali U grafičkom okruženju, sučelje pruža program, koji stvara prozore, pomične trake, izbornike i slično. U okruženju naredbene linije, korisničko sučelje stvara školjka (shell), koja interpretira naredbe i općenito stvari čini upotrebljivim.Odmah nakon prijave (koja je pokrivena u ovom poglavlju), korisnici su stavljeni u školjku i dozvoljeno im je obavljati njihov posao. Ovo poglavlje služi kao uvod u školjku i u najuobičajniju školjku među Linux korisnicima -- Bourne Again Shell (bash). Za detaljnije informacije o biločemu u ovom poglavlju, pogledajte bash(1) man stranicu. 8.1 Korisnici 8.1.1 Prijava Dakle upalili ste računalo i na ekranu se nalazi nešto slično ovome: Welcome to Linux 2.4.18 Last login: Wed Jan 1 15:59:14 -0500 2005 on tty6. darkstar login: Hmm.. nitko nije ništa rekao o prijavi. I što je darkstar? Ne brinite; najvjerojatnije niste slučajno ostvarili međuplanetarnu komunikacijsku vezu na neki umjetni mjesec Imperija. (Bojim se, da takva veza nije još podržana u trenutačnoj jezgri. Možda nam verzija 2.8 konačno ponuditi ovu često zahtijevanu mogućnost). Ustvari je darkstar samo ime jednoga od naših računala, i to ime se uobičajno pojavi. Ako ste postavili ime računala pri instalaciji, vidjet ćete to ime umjesto darkstar. Što se tiče prijave... Ako je ovo vaš prvi put, željet ćete se prijaviti kao root korisnik. Sustav će vas pitati lozinku; ako ste postavili lozinku tijekom instalacije, sad je vrijeme da ju utipkate, ako niste, onda samo pritisnite enter. To je to-- unutra ste! 8.1.2 Root: Superkorisnik Dobro, tko ili šta je root? I šta radi sa računom na vašem sustavu? U svijetu Unixa i njemu sličnih operativnih sustava (Linux), postoje korisnici i postoji druga vrsta korisnika. Detaljnije ćemo to pogledati kasnije, ali važna stvar je, da znate da je root korisnik nad svim korisnicima; root je sveznajući i svemogući i svi ga slušaju. Nema drugog načina, root je ?superkorisnik?. I najbolje od svega, root ste vi. Odlično, zar ne? Ukoliko niste sigurni, da, to je odlično. Ali stvar je u tome, da je root korisniku dopuišteno pokvariti sve što želi. Možda želite preskočiti na odjeljak 12.1.1 i pogledat kako dodati korisnika; nakon toga prijavite se kao običan korisnik i nastavite. Tradicionalna mudrost nam govori, da je najbolje postati superkorisnika samo tada, kada je to nužno, na taj način ćete smanjiti mogućnost slučajnog uništavanja sustava. Usput, ako odlučite postati root, dok ste prijavljeni kao netko drugi, nema problema. Samo upotrijebite naredbu su(1). Sustav će vas pitati za lozinku i nakon toga ćete postati root korisnik dok ne izađete (exit) ili se odjavite (logout). Ist tako možete postati neki drugi korsinik, naravno ukoliko poznajete njihovu lozinku, naprimjer su logan će napraviti od mene vas. Note root korisniku je dozvoljeno koristiti su kako bi postao bilo koji korisnik, bez obaveze da poznaje njihovu lozinku. 8.2 Naredbena Linija 8.2.1 Pokretanje Programa Teško je nešto napraviti, bez pokretanja nekog programa; možda ćete moći pritisnuti nešto sa vašim računalom ili možda držati sa kutijom vrata otvorena, i neka će računala, kad su pokrenuta, davati od sebe simpatično zujanje, ali to bi bilo sve. Mislim, da se možemo svi složiti da korištenje računala kao zujući držač za vrata nije ono što ga je dovelo do popularnosti kakvu ima danas. Dakle, sjećate li se da smo rekli, da je skoro sve u Linuxu datotaka? Isto vrijedi i za programe. Svaka naredba koju pokrenete (koja nije ugrađena u školjku) se nalazi negdje kao datoteka. Program pokrenete jednostavno tako, da navedete put do njega. Naprimjer, sjećate li se su naredbe iz prošlog odjeljka? Ustvari se nalazi u /bin direktoriju: /bin/su bi dakle isto tako pokrenulo su. Dakle, zašto radi i kad napišemo samo su? Nakon svega, niste rekli, da se nalazimo u /bin, mogli bi biti i u /usr/local/share? Kako ste znali? odgovor na ove laži se nalazi u PATH varijabli okruženja; većina školjki ima ili PATH ili nešto slično njoj. Ubiti sadrži popis direktorija u kojima pokušava pokrenuti vaš program. Dakle kad pokrenete su, vaša će školjka provijeriti vaš popis direktorija, provjeravajući dali direktorij sadrži izvedljivu datoteku su, kad naiđe na prvu, tu će i izvesti. To se dogodi, kada pokrenete program bez točnog puta do njega; ako dobijete ??Command not found?? grešku, to samo znači, da program, kojeg ste pokušali izvesti nije u vašem PATH-u. (Dakako mogće je da taj program uopšte ne postoji...) Varijable okruženja ćemo detaljnije pogledati u Odjeljku 8.3.1. Sjetite se da je ?.? prečica za trenutni direktorij, dakle ako se slučajno nalazite u /bin, ./su bi funkcioniralo kao eksplicitan točan put do naredbe. 8.2.2 Zamjenski znakovi Skoro svaka školjka prepoznaje neke znakove kao zamjene ili kratice koje znače, da se na tom mjestu može nalazit bilo što. Takvi znakovi su nazvani zamjenski znakovi; obično ? i ?. ? obično zamjenjuje bilo koji znak. Naprimjer, pretpostavimo, da ste u direktoriju sa tri datoteke ex1.txt, ex2, txt, ex3.txt. Željeli bi kopirati sve te tri datoteke (cp naredba pokrivena u Odjeljku 10.5.1) u neki drugi direktorij, recimo /tmp. Tipkanje cp ex1.txt ex2.txt ex3.txt /tmp je previše. Puno je lakše napisati cp ex?.txt /tmp; ? će biti jednak znakovima ?1?, ?2? i ?3?. Pitat ćete šta je sad to, još uvijek imamo previše posla? Imate pravo, srećom imamo i *. Kao što smo prije spomenuli, * zamjenjuje ?bilo koliko znakova?, uključujući 0. Dakle ako su te tri datoteke jedine u direktoriju, mogli bi jednostavno napisati cp * /tmp. Pretpostavimo ipak, da je u direktoriju i datoteka ex.txt i hejaz.txt. Želimo kopirati ex.txt ali ne i hejaz.txt; cp ex* /tmp. cp ex?.txt /tmp,, bi dakako kopiralo samo prva naše originalne tri datoteke; jer u imenu ex.txt nema znaka koji bi mogao zamijeniti ?. Više puta ćemo susrest i par uglatih zagrada [ ]. Bilo koji znakovi unutar zagrada će biti stavljeni umjesto [ ]. Zvuči zbunjujuće? Ali nije tako loše. Pretpostavimo da imamo direktorij koji sadrži sljedećih 8 datoteka: a1, a2, a3, a4, aA, aB, aC, i aD. Želimo pronaći samo datoteke, koje završavaju sa brojkom; [ ] nam to omogućuje. % ls a[1-4] a1 a2 a3 a4 Ali željeli smo samo a1, a2 i a4? U prošlom primjeru smo koristili - to znači sve vrijednosti između 1 i 4. Isto tako možemo podijeliti pojedine unose sa zarezima. % ls a[1,2,4] a1 a2 a4 Znam na što mislite, ?Dobro što je sa slovima?? Linux razlikuje velika i mala slova, što znači, da imaju a i A različito značenje i povezani su samo u vašoj glavi. Velika slova uvijek dođu ispred malih, tako su A i B pred a i b. Da nastavimo sa primjerom od prije, ako želimo datoteke a1 i A1, možemo ih brzo pronać sa [ ]. % ls [A,a]1 A1 a1 Note, ako bi umjesto zareza stavili crticu, dobili bi krive rezultate. % ls [A-a]1 A1 B1 C1 D1 a1 Možete čak i kombinirati zarez i crticu. % ls [A,a-d] A1 a1 b1 c1 d1 8.2.3 Preusmjerivanje Ulazna/Izlazna i Pajping (Ovdje se nalazi nešto kul.) % ps > blargh Znate li što je ovo? Pokrenuli smo ps, da bi vidjeli koji su sve procesi pokrenuti; ps je opisan u Odjeljku 11.3. Ali to nije kul dio. Kul dio je > blargh, što znači, otprilike, uzmi izlaz iz ps i piši ga u datoteku nazvanu blargh. Ali čekajte, postaje zanimljivije. % ps | less Ova naredba uzima izlaz ps i šalje ga kroz less, tako smo u mogućnosti pomicati se po ispisu. % ps >> blargh Ovo je treći najkorišteniji preusmjerivač; radi istu stvar kao ?>?, samo što ?>>? dodaje izlaz ps na kraj datoteke blargh, ako ta datoteka postoji, inače kao kod ?>? tu datoteku napravi. ( ?>? će prepisati trenutačan sadržaj datoteke blargh) Postoji i operator ? unixfile.txt Preusmjeravanje postane zabavno, kad složimo više njih u jednu naredbu: % ps | tac >> blargh Ova naredba će pokrenuti ps, okrenuti redosljed linija u izlazu i dodati ih na kraj datoteke blargh. Možete složiti bilo koliko preusmjerenja, ali pazite, naredbe se uvijek interpretiraju sa lijeve strane prema desnoj. Pogledajte bash(1) man stranicu za detaljnije informacije o preusmjerivanju. 8.3 Bourne Again Shell (bash) 8.3.1 Varijable Okruženja Linux sustav je komplicirana zvijer, i moramo voditi računa o dosta stvari, puno malih detalja koji dolaze u igru u vašoj svakodnevnoj interakciji sa programima (neke od njih vas niti ne zanimaju). Nitko ne želi dodati puno postavki za svaki program koji pokrene, da bi mu pokazao koji terminal se koristi, koje je ime i adresa računala, kako bi trebao izgledati naredbeni redak. zato imaju korisnici kao mehanizam za kopiranje, okruženje. Okruženje definira uvjete u kojima će se programi pokretati i neke od tih definicija su varijable; korisnik ih može mjenjati i igrati se sa njima. Više-manje svaka školjka ima varijable okruženja (ako ih nema, nije baš koristna školjka). Ovdje ćemo pogledati naredbe koje nam daje bash za manipulaciju varijablama okruženja. set pozvan sam, će vam prikazati sve varijable okruženja, koje su trenutačno postavljene i njihove vrijednosti. Kao većina bash programa, možmo i za set koristiti različite parametre; ali to ćemo ostaviti bash(1) man stranici. Primjer 8-1 pokazuje isječak iz set naredbe pokrenute na avtorovom računalu. Obratite pažnju na PATH varijablu o kojoj smo pričali ranije. Programi koji se nalaze u bilo kojem od ovih direktorija, mogu biti pokrenuti jednostavno sa njihovim imenom. Primjere 8-1. Ispis varijabli okruženja sa set % set PATH=/usr/local/lib/qt/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin: /usr/openwin/bin:/usr/games:.:/usr/local/ssh2/bin:/usr/local/ssh1/bin: /usr/share/texmf/bin:/usr/local/sbin:/usr/sbin:/home/logan/bin PIPESTATUS=([0]="0") PPID=4978 PS1='\h:\w\$ ' PS2='> ' PS4='+ ' PWD=/home/logan QTDIR=/usr/local/lib/qt REMOTEHOST=ninja.tdn SHELL=/bin/bash % unset VARIABLE unset će izbrisati bilo koju varijablu koju mu damo; bash će potpuno zaboraviti, da je ta varijabla ikad postojala. (Ne bojte se. Ako nije nešto što ste sami definirali u toj školjkinoj sesiji, najvjerojatnije će biti ponovno postavljeno u bilo kojoj drugoj sesiji.) % export VARIABLE=neka_vrijednost export je upotrebljiv. Koristeći ga, varijabli VARIABLE postavimo vrijednost ?neka_vrijednost?; ako VARIABLE nije postojala, sad postoji. Ako je VARIABLE imala neku vrijednost, sad je nema više. To i nije tako dobro, ako smo željeli samo dodati direktorij u naš PATH. U našem slučaju vjerojatno želimo napravit ovo: % export PATH=$PATH:/neki/novi/direktorij Pazite na upotrebu $PATH: kad želimo da bash interpretira varijablu (zamijeni ju sa njezinom vrijednošću), ispred imena stavljamo $. Naprimjer, echo $PATH će ispisati vrijednost PATH: % echo $PATH /usr/local/lib/qt/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin: /usr/openwin/bin:/usr/games:.:/usr/local/ssh2/bin:/usr/local/ssh1/bin: /usr/share/texmf/bin:/usr/local/sbin:/usr/sbin:/home/logan/bin 8.3.2 Tab Dopuna (Opet jedna "kul" stvar) 1. Sučelje u obliku naredbene linije znači dosta tipkanja. 2. Tipkanje je rad. 3. Nitko ne voli raditi. Iz 3 i 2 možemo zaključiti, da (4) nitko ne voli tipkanje. Srećom, bash nas spašava od (5) (nitko ne voli naredbenu liniju). Ali kako bash to radi? Osim mogućnosti upotrebe zamjenskih znakova, bash nam omoguća i tab dopunu. Tab dopuna radi nekako ovako: Tipkate ime datoteke. Možda je u vašem PATH, možda ga tipkate eksplicitno. Sve što trebate učiniti jest natipkati dovoljno znakova, da bi ju jedinstveno identificirali. Nakon toga pritisnite tipku tab. Bash će sam otkriti željeno ime i dovršiti ga umjesto vas! Vrijeme za primjer: /usr/src ima dva poddirektorija: /usr/src/linux i /usr/src/sendmail. Želimo vidjeti što je u /usr/src/linux. Dakle samo natipkamo ls /usr/src/l, pritisnemo TAB tipku, i bash će nam dati ls /usr/src/linux. Pretpostavimo, da postoje dva direktorija, usr/src/linux i /usr/src/linux-old; Ako napišemo /usr/src/l i pritisnemo TAB, bash će dopuniti koliko može i dobit ćemo /usr/src/linux. U slučaju da pritisnemo TAB još jednom, bash će nam prikazati popis svih direktorija, koji odgovaraju već natipkanom tekstu. Dakle, manje tipkanja (i prema tome ljudi mogu voljeti naredbenu liniju). I kao što smo rekli, "kul" je. 8.4 Virtualni Terminali Predpostavimo, da smo usred nekog posla i želimo napraviti nešto drugo. Možemo jednostavno zatvoriti sadašnji proces, ali ovo je sustav za više korisnika i moožemo se prijaviti odjednom koliko god puta želimo. Zašto bi onda radili samo jednu stvar odjednom? Nije potrebno. Nažalost nismo svi u mogućnosti posjedovati više tastatura, miševa i monitora za jedno računalo; najvjerojatnije ih ni ne želimo. Hardver dakle nije rješenje. Ostaje nam softver i Linux nam u tu svrhu nudi ?virtualne terminale? ili ?VTe?. Ukoliko pritisnete Alt i neku funkcijsku tipku, možete mijenjati virtualne terminale; svaka funkcijska tipka predstavlja jedan. Slackware ima priuzeto login na VT 6. Alt+F2 će nas staviti u VT 2, Alt+F3 u VT 3 itd. Ostale funkcijske tipke su rezervirane za X >>>>>>sessions<<<<<<. Svaka X session koristi svoj vlastiti VT, počevši sa VT 7 naprijed. U X-u je kombinacija Alt+Funkcijska tipka zamijenjena sa Ctrl+Alt+Function; ukoliko ste u X-u, za povratak u okruženje naredbene linije (bez da zatvorite X), potrebno je pritisnuti npr. Ctrl+Alt+F3 za otvaranje VT3. (Alt+F7 će vas vratiti nazad u X, pretpostavljajući da koristite prvi X >>>>>>session<<<<<<<). 8.4.1 Screen Ali što učiniti, ako primjerice nema virtualnih terminala? Što onda? Srećom, Slackware sadrži predivan >>>>>>>>>>terminal session<<<<. Ctrl+A+N nas prebaci u sljedeći terminal a Ctrl+A+P nas pomakne jedan terminal unazad. Isto tako screen omogućava odklapanje i priklapanje screen >>>>sessions<<<. To je posebice upotrebivo kod >>>>>>remote sessions<<<< preko ssh i/ili telnet protokola (više o njima kasnije). Ctrl+A+D će odklopiti trenutačni screen. Izvođenje naredbe screen -r će na ekran izpisati sve trenutačno dostupne screen >>>sessions<<<, na koje se možemo ponovno priključiti. % screen -r There are several suitable screens on: 1212.pts-1.redtail (Detached) 1195.pts-1.redtail (Detached) 1225.pts-1.redtail (Detached) 17146.pts-1.sanctuary (Dead ???) Remove dead screens with 'screen -wipe'. Type "screen [-d] -r [pid.]tty.host" to resume one of them. Pokretanjem screen -r 1212 priklapamo prvi screen na listi. Prije smo spomenuli kako je to koristno za >>>>>>>remote sessions<<<<<<. Ako smo prijavljeni na >>>>remote<<<< Slackware server preko ssh-a i naša veza pukne, sve što smo radili nestane, u takvom slučaju možemo nehotice nanijeti štetu samom serveru. Korištenjem screen-a, smanjujemo taj rizik, u slučaju da veza pukne, odmah kad ju ponovno uspostavimo, možemo se priključiti na screen >>>session<<< i nastaviti točno tamo gdje smo stali